【发布时间】: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