2017-02-18 11 views
2

Мне нужна помощь снова, ребята. Кажется, что моя активность камеры (которая является фрагментом) перекрывает мой навигационный ящик. Я не знаю, как это решить.Камера перекрывает навигационный ящик - Android

Это мой, как это выглядит:

Click Here

Это мой код для CameraFragment.java:

public class CameraFragment extends Fragment { 

    private Camera mCamera = null; 
    private CameraView mCameraView = null; 


    View v; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     v = inflater.inflate(R.layout.activity_first_fragment, container, false); 


     try { 
      mCamera = Camera.open();//you can use open(int) to use different cameras 
     } catch (Exception e) { 
      Log.d("ERROR", "Failed to get camera: " + e.getMessage()); 
     } 

     if (mCamera != null) { 
      mCameraView = new CameraView(getActivity(), mCamera);//create a SurfaceView to show camera data 
      FrameLayout camera_view = (FrameLayout) v.findViewById(R.id.camera_view); 
      camera_view.addView(mCameraView);//add the SurfaceView to the layout 
      // camera_view.onCreate(savedInstanceState); 
     } 
     //-------------------------------------------------------------------------------camera 

     return v; 
    } 

    private class CameraView extends SurfaceView implements SurfaceHolder.Callback { 

     private SurfaceHolder mHolder; 
     private Camera mCamera; 

     public CameraView(Context context, Camera camera) { 
      super(context); 
      mCamera = camera; 
      mCamera.setDisplayOrientation(90); 
      //get the holder and set this class as the callback, so we can get camera data here 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder surfaceHolder) { 
      try{ 
       //when the surface is created, we can set the camera to draw images in this surfaceholder 
       mCamera.setPreviewDisplay(surfaceHolder); 
       mCamera.startPreview(); 
      } catch (IOException e) { 
       Log.d("ERROR", "Camera error on surfaceCreated " + e.getMessage()); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
      //before changing the application orientation, you need to stop the preview, rotate and then start it again 
      if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data 
       return; 

      try{ 
       mCamera.stopPreview(); 
      } catch (Exception e){ 
       //this will happen when you are trying the camera if it's not running 
      } 

      //now, recreate the camera preview 
      try{ 
       mCamera.setPreviewDisplay(mHolder); 
       mCamera.startPreview(); 
      } catch (IOException e) { 
       Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage()); 
      } 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
      //our app has only one screen, so we'll destroy the camera in the surface 
      //if you are using with more screens, please move this code your activity 
      mCamera.stopPreview(); 
      mCamera.release(); 
     } 
     } 
    } 

Это мой activity_camera.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_first_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.dcar.FirstFragment"> 
<!-- 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_second_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.dcar.MainActivity" 
    > 
--> 
    <FrameLayout 
     android:id="@+id/camera_view" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     > 

    </FrameLayout> 
<!-- 
</FrameLayout> 
--> 
</RelativeLayout> 

MainActivity.java:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 



    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
      navigationView.setNavigationItemSelectedListener(this); 

Fragment home = new FirstFragment(); 
     FragmentManager FM = getFragmentManager(); 
     FM 
       .beginTransaction() 
       .replace(R.id.content_frame, home) 


        .commit(); 
} 

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     android.app.FragmentManager fragmentManager = getFragmentManager(); 

     if (id == R.id.action_ar) { 
      fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, new CameraFragment()) 
        .commit(); 
     } 
     else if (id == R.id.action_map) { 
      fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, new SecondFragment()) 
        .commit(); 

     } 
     else if (id == R.id.action_direction) { 

      fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, new ThirdFragment()) 
        .commit(); 

     } 

Мой activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 
+0

Какой навигационный ящик? В вашем макете нет ничего, что создало бы ящик, в обычном смысле «ящик». –

+0

У меня есть. Но я не вставлял его здесь. Как вы можете видеть в «Нажмите здесь», я поместил имя «Передвижной ящик» (цвет синий), чтобы вы могли его идентифицировать. – Problematic

+0

Если у вас возникла проблема с выдвижным ящиком, нам нужно посмотреть, как выполняется выдвижной ящик. Просто изображения не хватит. Вы также должны включить любые транзакции «Фрагмент», которые вы совершили в «Деятельности». –

ответ

0

Я была такая же проблема. Это работает для меня

drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { 
    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     drawerLayout.bringChildToFront(drawerView); 
     drawerLayout.requestLayout(); 
    } 
    ... 
} 
Смежные вопросы