2017-07-25 240 views
1

我組合導航抽屜與選項卡布局。在該選項卡中,佈局適用於三個選項卡,但導航抽屜運行不正常。導航抽屜圖標消失了,它通過滑動打開而沒有通過滑動關閉。並且導航抽屜中的菜單也不起作用。導航抽屜不工作

    <?xml version="1.0" encoding="utf-8"?> 
    <android.support.v4.widget.DrawerLayoutxmlns: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" /> 

<LinearLayout 
    android:id="@+id/main_layout" 
    android:orientation="vertical" 
    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" 
    tools:context=".MainActivity"> 

    <!-- our toolbar --> 
    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

    <!-- our tablayout to display tabs --> 
    <android.support.design.widget.TabLayout 
     android:id="@+id/tabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

    <!-- View pager to swipe views --> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent"/> 

</LinearLayout> 




public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener { 

private NavigationView navigationView; 
private DrawerLayout drawer; 
private View navHeader; 
private ImageView imgNavHeaderBg, imgProfile; 
private TextView txtName, txtWebsite; 
private Toolbar toolbar; 
private FloatingActionButton fab; 
ActionBar actionBar; 
//This is our tablayout 
private TabLayout tabLayout; 

//This is our viewPager 
private ViewPager viewPager; 

// urls to load navigation header background image 
// and profile image 
private static final String urlNavHeaderBg = "http://api.androidhive.info/images/nav-menu-header-bg.jpg"; 
private static final String urlProfileImg = "https://lh3.googleusercontent.com/eCtE_G34M9ygdkmOpYvCag1vBARCmZwnVS6rS5t4JLzJ6QgQSBquM0nuTsCpLhYbKljoyS-txg"; 

// index to identify current nav menu item 
public static int navItemIndex = 0; 

// tags used to attach the fragments 
private static final String TAG_HOME = "home"; 
private static final String TAG_PHOTOS = "photos"; 
private static final String TAG_MOVIES = "movies"; 
private static final String TAG_NOTIFICATIONS = "notifications"; 
private static final String TAG_SETTINGS = "settings"; 
public static String CURRENT_TAG = TAG_HOME; 

// toolbar titles respected to selected nav menu item 
private String[] activityTitles; 

// flag to load home fragment when user presses back key 
private boolean shouldLoadHomeFragOnBackPress = true; 
private Handler mHandler; 


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

    actionBar = getSupportActionBar(); 
    actionBar.show(); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    // setSupportActionBar(toolbar); 

    mHandler = new Handler(); 

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    navigationView = (NavigationView) findViewById(R.id.nav_view); 

    View hView = navigationView.getHeaderView(0); 

    // fab = (FloatingActionButton) findViewById(R.id.fab); 

    // Navigation view header 
    navHeader = navigationView.getHeaderView(0); 
    txtName = (TextView) navHeader.findViewById(R.id.name); 
    txtWebsite = (TextView) navHeader.findViewById(R.id.website); 
    imgNavHeaderBg = (ImageView) navHeader.findViewById(R.id.img_header_bg); 
    imgProfile = (ImageView) navHeader.findViewById(R.id.img_profile); 

    // load toolbar titles from string resources 
    activityTitles = getResources().getStringArray(R.array.nav_item_activity_titles); 

    /* fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    });*/ 

    // load nav menu header data 
    loadNavHeader(); 

    // initializing navigation menu 
    setUpNavigationView(); 

    if (savedInstanceState == null) { 
     navItemIndex = 0; 
     CURRENT_TAG = TAG_HOME; 
     loadHomeFragment(); 
    } 

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


    //Initializing the tablayout 
    tabLayout = (TabLayout) findViewById(R.id.tabLayout); 

    //Adding the tabs using addTab() method 
    tabLayout.addTab(tabLayout.newTab().setText("Home")); 
    tabLayout.addTab(tabLayout.newTab().setText("Search Bride")); 
    tabLayout.addTab(tabLayout.newTab().setText("Search Groom")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    //Initializing viewPager 
    viewPager = (ViewPager) findViewById(R.id.pager); 

    //Creating our pager adapter 
    Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount()); 

    //Adding adapter to pager 
    viewPager.setAdapter(adapter); 

    tabLayout.setOnTabSelectedListener(this); 
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 


     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      tabLayout.setScrollPosition(position, positionOffset, true); 
     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 

     //Adding onTabSelectedListener to swipe views 

     //tabLayout.setOnClickListener(); 


    }); 
} 


/*** 
* Load navigation menu header information 
* like background image, profile image 
* name, website, notifications action view (dot) 
*/ 
private void loadNavHeader() { 
    // name, website 
    txtName.setText("shubham"); 
    txtWebsite.setText("[email protected]"); 

    // loading header background image 
    Glide.with(this).load(urlNavHeaderBg) 
      .crossFade() 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(imgNavHeaderBg); 

    // Loading profile image 
    Glide.with(this).load(urlProfileImg) 
      .crossFade() 
      .thumbnail(0.5f) 
      .bitmapTransform(new CircleTransform(this)) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(imgProfile); 

    // showing dot next to notifications label 
    navigationView.getMenu().getItem(3).setActionView(R.layout.menu_dot); 
} 

/*** 
* Returns respected fragment that user 
* selected from navigation menu 
*/ 
private void loadHomeFragment() { 
    // selecting appropriate nav menu item 
    selectNavMenu(); 

    // set toolbar title 
    setToolbarTitle(); 

    // if user select the current navigation menu again, don't do anything 
    // just close the navigation drawer 
    if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) { 
     drawer.closeDrawers(); 

     // show or hide the fab button 
     //toggleFab(); 
     return; 
    } 

    // Sometimes, when fragment has huge data, screen seems hanging 
    // when switching between navigation menus 
    // So using runnable, the fragment is loaded with cross fade effect 
    // This effect can be seen in GMail app 
    Runnable mPendingRunnable = new Runnable() { 
     @Override 
     public void run() { 
      // update the main content by replacing fragments 
      HomeFragment fragment = getHomeFragment(); 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, 
        android.R.anim.fade_out); 
      // FragmentTransaction replace = fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG); 
      fragmentTransaction.commitAllowingStateLoss(); 
     } 
    }; 

    // If mPendingRunnable is not null, then add to the message queue 
    if (mPendingRunnable != null) { 
     mHandler.post(mPendingRunnable); 
    } 

    // show or hide the fab button 
    // toggleFab(); 

    //Closing drawer on item click 
    drawer.closeDrawers(); 

    // refresh toolbar menu 
    invalidateOptionsMenu(); 
} 

private HomeFragment getHomeFragment() { 
    switch (navItemIndex) { 
     case 0: 
      // home 
      HomeFragment homeFragment = new HomeFragment(); 
      return homeFragment; 
     case 1: 
      // photos 
      PhotosFragment photosFragment = new PhotosFragment(); 
      return photosFragment; 
     case 2: 
      // movies fragment 
      MoviesFragment moviesFragment = new MoviesFragment(); 
      return moviesFragment; 
     case 3: 
      // notifications fragment 
      NotificationFragment notificationsFragment = new NotificationFragment(); 
      return notificationsFragment; 

     case 4: 
      // settings fragment 
      SettingsFragment settingsFragment = new SettingsFragment(); 
      return settingsFragment; 
     default: 
      return new HomeFragment(); 
    } 
} 

private void setToolbarTitle() { 
    getSupportActionBar().setTitle(activityTitles[navItemIndex]); 
} 

private void selectNavMenu() { 
    navigationView.getMenu().getItem(navItemIndex).setChecked(true); 
} 

private void setUpNavigationView() { 
    //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     // This method will trigger on item Click of navigation menu 
     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 

      //Check to see which item was being clicked and perform appropriate action 
      switch (menuItem.getItemId()) { 
       //Replacing the main content with ContentFragment Which is our Inbox View; 
       case R.id.nav_home: 
        navItemIndex = 0; 
        CURRENT_TAG = TAG_HOME; 
        break; 
       case R.id.nav_photos: 
        navItemIndex = 1; 
        CURRENT_TAG = TAG_PHOTOS; 
        break; 
       case R.id.nav_movies: 
        navItemIndex = 2; 
        CURRENT_TAG = TAG_MOVIES; 
        break; 
       case R.id.nav_notifications: 
        navItemIndex = 3; 
        CURRENT_TAG = TAG_NOTIFICATIONS; 
        break; 
       case R.id.nav_settings: 
        navItemIndex = 4; 
        CURRENT_TAG = TAG_SETTINGS; 
        break; 
       case R.id.nav_about_us: 
        // launch new intent instead of loading fragment 
        startActivity(new Intent(MainActivity.this, AboutUsActivity.class)); 
        drawer.closeDrawers(); 
        return true; 
       case R.id.nav_privacy_policy: 
        // launch new intent instead of loading fragment 
        startActivity(new Intent(MainActivity.this, PrivacyPolicyActivity.class)); 
        drawer.closeDrawers(); 
        return true; 
       default: 
        navItemIndex = 0; 
      } 

      //Checking if the item is in checked state or not, if not make it in checked state 
      if (menuItem.isChecked()) { 
       menuItem.setChecked(false); 
      } else { 
       menuItem.setChecked(true); 
      } 
      menuItem.setChecked(true); 

      loadHomeFragment(); 

      return true; 
     } 
    }); 


    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer,toolbar, R.string.openDrawer, R.string.closeDrawer) { 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank 
      super.onDrawerClosed(drawerView); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    //Setting the actionbarToggle to drawer layout 
    drawer.setDrawerListener(actionBarDrawerToggle); 

    //calling sync state is necessary or else your hamburger icon wont show up 
    actionBarDrawerToggle.syncState(); 
} 


@Override 
public void onBackPressed() { 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawers(); 
     return; 
    } 

    // This code loads home fragment when back key is pressed 
    // when user is in other fragment than home 
    if (shouldLoadHomeFragOnBackPress) { 
     // checking if user is on other navigation menu 
     // rather than home 
     if (navItemIndex != 0) { 
      navItemIndex = 0; 
      CURRENT_TAG = TAG_HOME; 
      loadHomeFragment(); 
      return; 
     } 
    } 

    super.onBackPressed(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 

    // show menu only when home fragment is selected 
    if (navItemIndex == 0) { 
     getMenuInflater().inflate(R.menu.main, menu); 
    } 

    // when fragment is notifications, load the menu created for notifications 
    if (navItemIndex == 3) { 
     getMenuInflater().inflate(R.menu.notifications, menu); 
    } 
    return true; 
} 

@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(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_logout) { 
     Toast.makeText(getApplicationContext(), "Logout user!", Toast.LENGTH_LONG).show(); 
     return true; 
    } 

    // user is in notifications fragment 
    // and selected 'Mark all as Read' 
    if (id == R.id.action_mark_all_read) { 
     Toast.makeText(getApplicationContext(), "All notifications marked as read!", Toast.LENGTH_LONG).show(); 
    } 



    // user is in notifications fragment 
    // and selected 'Clear All' 
    if (id == R.id.action_clear_notifications) { 
     Toast.makeText(getApplicationContext(), "Clear all notifications!", Toast.LENGTH_LONG).show(); 
    } 

    return super.onOptionsItemSelected(item); 
} 

// show or hide the fab 





@Override 
public void onTabSelected(TabLayout.Tab tab) { 

    viewPager.setCurrentItem(tab.getPosition()); 

} 

@Override 
public void onTabUnselected(TabLayout.Tab tab) { 


} 

@Override 
public void onTabReselected(TabLayout.Tab tab) { 

} 
+1

發表您的XML代碼 – MinnuKaAnae

+0

PLZ檢查提供的XML。 –

回答

0

你好,請按照此順序標籤導航抽屜

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

    <android.support.design.widget.CoordinatorLayout 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/main_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     android:background="#ffffff"> 
      <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <android.support.design.widget.AppBarLayout 
       android:id="@+id/appbar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:paddingTop="@dimen/appbar_padding_top" 
       android:theme="@style/MainTheme.AppBarOverlay"> 
       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        android:background="?attr/colorPrimary" 
        app:layout_scrollFlags="scroll|enterAlways" 
        app:popupTheme="@style/MainTheme.PopupOverlay"/> 
      <android.support.design.widget.TabLayout 
      android:id="@+id/tabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="?attr/colorPrimary" 
      android:minHeight="?attr/actionBarSize" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 
     </android.support.design.widget.AppBarLayout> 
      <!-- View pager to swipe views --> 
      <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent"/> 
     </RelativeLayout> 
      <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

感謝MinnuKaAnae的幫助。/\ –

+0

如果它幫助你,請接受我的回答,謝謝 – MinnuKaAnae