打开某些片段时如何隐藏导航抽屉?

时间:2016-07-18 09:20:32

标签: android android-fragments navigation-drawer android-toolbar

我是android开发的新手。我希望在用户未登录时隐藏导航抽屉。所以基本上,它会显示登录片段(更好的全屏幕像Facebook android)。如果用户已经登录,将始终显示导航抽屉。

  

MainActivity.java

public class MainActivity extends AppCompatActivity {

private DrawerLayout navDrawerLayout;
private Toolbar toolbar;
private ActionBarDrawerToggle navDrawerToggle;

private SharedPreferences pref;

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

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

    navDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    // Find our drawer view
    NavigationView navDrawerView = (NavigationView) findViewById(R.id.navdrawer_view);
    // Setup drawer view
    setupDrawerContent(navDrawerView);

    navDrawerToggle = setupDrawerToggle();

    pref = getPreferences(0);
    initFirstFrame();
}

private ActionBarDrawerToggle setupDrawerToggle() {
    return new ActionBarDrawerToggle(this, navDrawerLayout, toolbar, R.string.drawer_open,  R.string.drawer_close);
}

private void setupDrawerContent(NavigationView navDrawerView) {
    navDrawerView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    selectDrawerItem(menuItem);
                    return true;
                }


            });
}

public void selectDrawerItem(MenuItem menuItem) {
    // Create a new fragment and specify the fragment to show based on nav item clicked
    Fragment fragment = null;
    Class fragmentClass;
    switch(menuItem.getItemId()) {
        case R.id.events:
            fragmentClass = EventsFragment.class;
            break;
        case R.id.pengumuman:
            fragmentClass = NewsFragment.class;
            break;
        case R.id.edit_profil:
            fragmentClass = ProfileFragment.class;
            break;
        default:
            fragmentClass = EventsFragment.class;
    }

    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Insert the fragment by replacing any existing fragment
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frame_content, fragment).commit();

    // Highlight the selected item has been done by NavigationView
    menuItem.setChecked(true);
    // Set action bar title
    setTitle(menuItem.getTitle());
    // Close the navigation drawer
    navDrawerLayout.closeDrawers();
}

private void initFirstFrame(){
    Fragment fragment;
    if(pref.getBoolean(Constants.IS_LOGGED_IN,false)){
        fragment = new ProfileFragment();
    }else {
        fragment = new LoginFragment();
        // in this login fragment, navdrawer should be invisible, the toolbar too I guess
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frame_content,fragment);
    fragmentTransaction.commit();
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return navDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}

// 'onPostCreate' called when activity start-up is complete after 'onStart()'
// NOTE! Make sure to override the method with only a single 'Bundle' argument
@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred
    navDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggles
    navDrawerToggle.onConfigurationChanged(newConfig);
}

}

2 个答案:

答案 0 :(得分:11)

定义一个接口,如DrawerLocker:

interface DrawerLocker{
   public void setDrawerLocked(boolean shouldLock);
}

在包含NavigationDrawer的activity中实现此接口并覆盖此方法。

class YourActivity implements DrawerLocker{
...
...
public void setDrawerLocked(boolean enabled){
    if(enabled){
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    }else{
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    }

}

现在在Fragment的onCreateView中,调用此方法,如:

 ((DrawerLocker)getActivity()).setDrawerLocked(true);

在Fragment的onDestroyView中,重新启用抽屉布局:

((DrawerLocker)getActivity()).setDrawerLocked(false);

答案 1 :(得分:0)

活动onCreate方法中的代码将在堆栈中有多个片段时阻止抽屉:

getSupportFragmentManager().addOnBackStackChangedListener(() -> {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            mViewHolder.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        } else {
            mViewHolder.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        }
    });