【问题标题】:How to hide navigation drawer when opening certain fragment?打开某些片段时如何隐藏导航抽屉?
【发布时间】:2016-07-18 09:20:31
【问题描述】:

我是 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);
}

}

【问题讨论】:

  • 使用 LoginActivity 和 MainActivity,导航抽屉所在的位置,而 Login 没有它。我就是这样做的。
  • @Vucko 如果我这样做了,那么如何将用户输入的每个数据解析到我的 MainActivity?如您所见,我有 ProfileFragment,该用户可以编辑电子邮件、密码等。对不起,我是初学者,不太了解意图。
  • 你需要学习,不要因为不熟悉而避免以某种方式去做。你基本上可以在网上找到任何东西。我建议在网上搜索有关登录的教程,以及在 Android Studio 中查找和研究名为“Login Activity”的模板。
  • 片段和活动之间通信的最佳方式是通过接口。它有助于代码重用,也可以在片段间使用。在谷歌中检查片段间通信。我的回答会暗示你的方向:)

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


【解决方案1】:

定义一个接口,比如 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);

【讨论】:

  • 注意:如果你决定在另一个activity上重用这个fragment,确保实现接口,如果那个activity没有导航抽屉,只需要实现一个空白方法
  • 嗨,抱歉打错了:它是一个方法调用 -> getActivity()。很高兴它帮助了你
  • @Kushan 哇,你真是个好人...+1000 非常感谢你,谢谢谢谢thansk...
  • 随时朋友:)
  • 这个答案对我也不起作用。但这样做了:stackoverflow.com/a/33003163/1617737
【解决方案2】:

当堆栈中有多个片段时,活动 onCreate 方法中的此代码将阻塞抽屉:

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

【讨论】:

    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多