打开某些片段时如何隐藏导航抽屉? [英] How to hide navigation drawer when opening certain fragment?
问题描述
我在android开发中是新手.我想在用户未登录时隐藏导航抽屉.因此,基本上,它将显示登录片段(更好的全屏显示效果,例如Facebook android).如果用户已经登录,导航抽屉将始终显示.
I'm pretty new in android development. I want to hide navigation drawer when user is not logged in. So basically, it will shown login fragment (better in full screen like Facebook android). And if user already logged in, navigation drawer will always shown.
MainActivity.java
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);
}
}
推荐答案
定义一个说DrawerLocker的接口:
Define an interface say DrawerLocker:
interface DrawerLocker{
public void setDrawerLocked(boolean shouldLock);
}
在包含NavigationDrawer的活动中实现此接口,并覆盖此方法.
Implement this interface in your activity which contains the NavigationDrawer and override this method.
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);
}
}
现在在您片段的onCreateView中,调用此方法,如下所示:
Now in your Fragment's onCreateView, call this method like:
((DrawerLocker)getActivity()).setDrawerLocked(true);
在您片段的onDestroyView中,重新启用抽屉布局:
In your Fragment's onDestroyView, re enable the drawer layout:
((DrawerLocker)getActivity()).setDrawerLocked(false);
这篇关于打开某些片段时如何隐藏导航抽屉?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!