我制作了一个工作的导航抽屉,如developer.android.com网站上的教程所示 . 但现在,我想使用一个导航抽屉,我在NavigationDrawer.class中为我的应用程序中的多个活动创建 .
我的问题是,如果这里有人可以制作一个小教程,这解释了如何使用一个导航抽屉进行多个活动 .
我先在这个答案中阅读了Android Navigation Drawer on multiple Activities
但它对我的项目不起作用
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
在这个活动中,我希望有导航抽屉,所以我扩展了'NavigationDrawer',在其他一些活动中,我希望用户使用相同的导航抽屉
public class SampleActivity extends NavigationDrawer {...}
我不知道要改变什么......
11 回答
所以这个答案是迟了几年但有人可能会欣赏它 . Android为我们提供了一个新的小部件,可以更轻松地使用一个导航抽屉和多个活动 .
android.support.design.widget.NavigationView是模块化的,在菜单文件夹中有自己的布局 . 您使用它的方式是以下列方式包装xml布局:
<include ... />
用于正在包装的布局(参见2)和一个android.support.design.widget.NavigationView .nav_header_main只是一个LinearLayout,其orientationInd为vertical,用于导航Drawar的 Headers .
activity_main_drawer是res / menu目录中的菜单xml . 它可以包含您选择的项目和组 . 如果您使用AndroidStudio图库,向导将为您制作一个基本的向导,您可以看到您的选项 .
<include ... >
为您的实际内容(见3) .现在,关于所有这些的一件很酷的事情是,您可以将这两个布局中的每个活动包装起来,但让您的NavigationView(请参阅步骤1)始终指向activity_main_drawer(或其他) . 这意味着您将在所有活动中使用相同的(*)导航抽屉 .
有一个解决方法:在我的实现中:我在第一个具有导航抽屉的活动中有片段 . 其他活动使用与第一个活动相同的代码创建ActionBar和导航抽屉,并且它们没有碎片,布局将在后面描述 . 在第一个活动中,项目的操作点击在同一活动中处理,而在其他活动中,操作稍后完成,首先我通过关闭其他活动切换到第一个活动 . 条件如下:
我已将主要布局放在第一个framelayout内,第二个framelayout专用于DrawerLayout中的Drawer .
我在第一个活动以外的活动的onResume上完成了抽屉初始化 . 这是因为它需要在新的意图更新后重新初始化,因为所有活动都是单个实例 .
通过这种方式,我可以在所有活动中使用NavigationDrawer和ActionBarCompat .
反过来可能是:根本不使用活动,而是使用片段,并在显示第一个片段的容器(例如,线性布局)中替换它们 .
代码在Android Developer Tutorials中提供,您只需自定义即可 .
http://developer.android.com/training/implementing-navigation/nav-drawer.html
建议您在应用程序中使用越来越多的片段,应用程序本地应该只有三个活动,您在AndroidManifest.xml中提到的除了外部活动之外(例如FacebookActivity):
SplashActivity:不使用片段,并使用FullScreen主题 .
LoginSignUpActivity:根本不需要NavigationDrawer,所以只需使用普通工具栏,但至少需要3或4个片段 . 使用noactionbar主题
HomeActivity或DashBoardActivity:使用noactionbar主题 . 在这里您需要导航抽屉,随后的所有屏幕都将是片段或嵌套片段,直到叶子视图 . 在此活动中,所有设置,用户配置文件等都将作为片段 .
[有关进一步指导,请参阅:https://stackoverflow.com/a/51100507/787399]
快乐编码!!
有了@Kevin van Mierlo的回答,你也可以实现几个抽屉 . 例如,默认菜单位于左侧(开始),另一个可选菜单位于右侧,仅在加载确定片段时显示 .
我已经能够做到这一点 .
将它用于toolbar.xml
如果愿意,可以将其用于导航 Headers 使用
我在Kotlin这样做:
抽屉的活动必须继承此
BaseAppCompatActivity
,在设置内容后调用super.onCreate
(实际上,可以移动到某个init方法)并在其布局中具有相应的ID元素如果您想要导航抽屉,则应使用片段 . 我上周遵循了本教程,效果很好:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
您还可以从本教程下载示例代码,以了解如何执行此操作 .
没有片段:
这是您的BaseActivity代码:
需要具有导航抽屉的所有其他活动应该扩展此活动而不是活动本身,例如:
XML
Edit:
我自己遇到了一些困难,所以如果你得到NullPointerExceptions,这里有一个解决方案 . 在BaseActivity中,将onCreate函数更改为
protected void onCreateDrawer()
. 其余的可以保持不变 . 在扩展BaseActivity的活动中,按以下顺序放置代码:这有助于我解决我的问题,希望它有所帮助!
如果您有任何问题可以随意提问,这就是您可以创建具有多个活动的导航抽屉的方法 .
Edit 2:
正如@GregDan所说,您的 BaseActivity 也可以覆盖
setContentView()
并在那里调用onCreateDrawer:我是Google I/O 2014应用程序中的've found the best implementation. It' .
他们使用与Kevin 's. If you can abstract yourself from all unneeded stuff in I/O app, you could extract everything you need and it is assured by Google that it'相同的方法正确使用导航抽屉图案 . 每个活动都可选择
DrawerLayout
作为其主要布局 . 有趣的部分是如何完成导航到其他屏幕 . 它在_475286中实现,如下所示:这与通过片段事务替换当前片段的常见方式不同 . 但是用户没有发现视觉差异 .
Easiest way to reuse a common Navigation drawer among a group of activities
app_base_layout.xml
AppBaseActivity.java
在baseactivity中更新此代码 . 并且不要忘记在您的活动xml中包含drawer_list_header .
并且不要在您的活动中使用request() . 但是在单击图像时仍然看不到抽屉......通过拖动它将在没有列表项的情况下可见 . 我尝试了很多但没有成功 . 需要一些锻炼...
对于任何想要做原始海报所要求的人,请考虑使用片段而不是凯文所说的方式 . 这是一个关于如何做到这一点的优秀教程:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
如果您选择使用活动而不是片段,则每次导航到新活动时都会遇到导航抽屉被重新创建的问题 . 这导致每次导航抽屉的丑陋/慢速渲染 .
使用片段在MainActivity中创建导航抽屉 .
在MainActivity中初始化导航抽屉
现在在你想要使用相同导航抽屉的所有其他活动中,将DrawerLayout作为基础,将片段作为导航抽屉 . 只需在片段中设置指向您的片段Java文件的android:name . 您不需要在其他活动中初始化片段 .
您可以在Google Play商店应用等其他活动中通过滑动访问Nav Drawer