我制作了一个可用的导航抽屉,就像developer.android.com网站上的教程中所示。但是现在,我想使用一个导航抽屉,我在 NavigationDrawer.class 中为我的应用程序中的多个活动创建。
我的问题是,如果这里有人可以制作一个小教程,它解释了如何将一个导航抽屉用于多个活动。
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); listItems = getResources().getStringArray(R.array.layers_array); drawerList = (ListView) findViewById(R.id.left_drawer); drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text, listItems)); drawerList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) { 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 {...}
如果你想要一个导航抽屉,你应该使用片段。我上周遵循了本教程,效果很好:
http://developer.android.com/training/implementing-navigation/nav- drawer.html
您还可以从本教程下载示例代码,以了解如何执行此操作。
没有片段:
这是您的 BaseActivity 代码:
public class BaseActivity extends Activity { public DrawerLayout drawerLayout; public ListView drawerList; public String[] layers; private ActionBarDrawerToggle drawerToggle; private Map map; protected void onCreate(Bundle savedInstanceState) { // R.id.drawer_layout should be in every activity with exactly the same id. 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); } }
所有其他需要导航抽屉的活动都应该扩展这个活动而不是活动本身,例如:
public class AnyActivity extends BaseActivity { //Because this activity extends BaseActivity it automatically has the navigation drawer //You can just write your normal Activity code and you don't need to add anything for the navigation drawer }
XML
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer --> </FrameLayout> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"/> </android.support.v4.widget.DrawerLayout>
编辑:
我自己也遇到了一些困难,所以如果你得到 NullPointerExceptions,这里有一个解决方案。在 BaseActivity 中将 onCreate 函数更改为protected void onCreateDrawer(). 其余的可以保持不变。在扩展 BaseActivity 的活动中,按以下顺序放置代码:
protected void onCreateDrawer()
super.onCreate(savedInstanceState); setContentView(R.layout.activity); super.onCreateDrawer();
这帮助我解决了我的问题,希望对您有所帮助!
如果您有任何问题,请随时提出,这就是您如何创建具有多个活动的导航抽屉。
编辑2:
正如@GregDan 所说,您 BaseActivity 也可以setContentView()在那里覆盖并调用 onCreateDrawer:
BaseActivity
setContentView()
@Override public void setContentView(@LayoutRes int layoutResID) { super.setContentView(layoutResID); onCreateDrawer() ; }