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