2017-11-23 14 views
1

DrawerLayout (메뉴 용 NavView 포함) 프래그먼트를 만들고 NavMenuFragment라는 이름을 지정하고이를 승계없이 mainActivity.java 클래스에 구현하려고했습니다. 디버거를 실행 한 후 조각의 레이아웃 파일에있는 모든 레이아웃이 초기화되지 않아 null이되는 것으로 나타났습니다. 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까?프래그먼트 레이아웃 구성 요소가 null입니다.

Fragment.java :

NavMenuFragment이 조각을 확장

공용 클래스 {

// NavMenu member vars 
private DrawerLayout mDrawerLayout; 
private NavigationView navigationView; 
private ActionBarDrawerToggle mToggle; // Button for toggling the side menu 

// Keeps the position of the previously selected menu item(0 : Home) 
int position = 0; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_nav_menu,null); 
    mDrawerLayout = view.findViewById(R.id.drawerLayout); 
    navigationView = view.findViewById(R.id.nav_view); 

    return view; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    mToggle = new ActionBarDrawerToggle(getActivity(),mDrawerLayout,R.string.drawer_open,R.string.drawer_closed); // Instantiating our button 

    // Sets the default selected menu item, to the Home item 
    navigationView.getMenu().findItem(R.id.nav_home).setChecked(true); 

    // Used to help on check and uncheck menu items when the user clicks on them 
    final List<MenuItem> items = new ArrayList<>(); 
    Menu menu; 
    menu = navigationView.getMenu(); 

    // Fill the list with all the menu items 
    for(int i=0; i<menu.size();i++) { 
     items.add(menu.getItem(i)); 
    } 

    Toast.makeText(getActivity(), "size:" + items.size(), Toast.LENGTH_SHORT).show(); 

    // When an item inside the NavView gets clicked, then handle the event... 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 

      switch (item.getItemId()) { 
       case R.id.nav_home: 
        mDrawerLayout.closeDrawer(Gravity.START); 
        break; 
       case R.id.nav_UserBoxGLB: 
        break; 
       case R.id.nav_UserBoxJP: 
        break; 
       case R.id.nav_settings: 
        break; 
       case R.id.nav_feedback: 
        break; 
       case R.id.nav_contact_us: 
        break; 
       case R.id.nav_donate: 
        // Open the website's URL in a browser window 
        Intent intent = new Intent(); 
        intent.setAction(Intent.ACTION_VIEW); 
        intent.addCategory(Intent.CATEGORY_BROWSABLE); 
        intent.setData(Uri.parse("http://www.google.com")); 
        startActivity(intent); 
        break; 
       case R.id.nav_about: 
        break; 
       default: 
        return onNavigationItemSelected(item); 
      } 
      items.get(position).setChecked(false); 
      item.setChecked(true); 
      mDrawerLayout.closeDrawers(); 
      return false; 
     } 
    }); 

    mDrawerLayout.addDrawerListener(mToggle); 
    // Set the hamburger icon's color 
    mToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.NavActionBarTextColor)); 
    mToggle.syncState(); 
} 

// When an item from the Action Bar gets tapped, then... 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return mToggle.onOptionsItemSelected(item) || onOptionsItemSelected(item); 
} 
} 

fragment.xml :

<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:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorPrimary" 
    android:id="@+id/drawerLayout"> 

    <!-- The actual side menu Nav View --> 
    <android.support.design.widget.NavigationView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/navigation_header" 
     app:menu="@menu/navigation_menu" 
     android:id="@+id/nav_view"> 

    </android.support.design.widget.NavigationView> 

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

을 시도하지'의 getView()'그런데 –

+0

는 FrameLayout이 필요하지 않습니다. DrawerLayout이 최상위보기입니다. –

+0

@ cricket_007 두 가지 팁에 감사드립니다. 슬프게도, 양쪽 모두를 구현하고 앱을 디버깅 한 후에도 조각의 레이아웃에있는 모든보기는 null입니다. –

답변

1
다음은 된 .java 클래스와 조각에서 .xml 파일은
  • 답례보기
  • 패스 보기 대신 개체 getView().
  • FrameLayout - 필요 없음.

당신은보기 매개 변수를 사용한다이 방법을

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
     View view = inflater.inflate(R.layout.fragment_nav_menu, null); 
     mDrawerLayout = view.findViewById(R.id.drawerLayout); 
     .................................. 
     navigationView = view.findViewById(R.id.nav_view); 

     return view; 
} 
+0

나는이 작업을 시도했으나 여전히이 모든 부분에 대해서는 내 견해가 모두 null입니다. 또한 위의 주석에서 제안 된 변경 사항을 구현했지만 변경된 사항은 없습니다. 이 줄을 바꾸면 어떤 긍정적 인 효과가 있습니까? 뷰보기 = inflater.inflate (R.layout.fragment_nav_menu, container); ? –

+0

@SteliosPapamichael 모든 뷰'view.findViewById'를 호출 했습니까? –

+0

@SteliosPapamichael은 xml과 코드에서'FrameLayout'을 제거합니다. –