fis*_*_zh 6 android navigation-drawer
我想要一个AbstractMainActivity来创建导航抽屉.在那里我还应该处理菜单项的点击,然后调用新的活动.在那些活动中,我想再次使用相同的导航抽屉.
我将使用AbstractMainActivity扩展Subclasses并以不同的方式从每个子类调用getLayoutResourceID(如下所示:android如何创建自己的Activity并扩展它?).
问题是,现在在我想构建导航抽屉的AbstractMainActivity中,我没有任何访问导航抽屉布局(xml)元素的权限,因为我当然希望为子类提供不同的基本布局.
我是否需要在所有子类布局文件中"包含布局"?但这不起作用,如果我想在导航抽屉中使用活动而不是片段,我该怎么办?
public abstract class MainActivity extends Activity {
private String[] menuItems;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
setContentView(getLayoutResourceId());
menuItems = getResources().getStringArray(R.array.menu_items);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menuItems));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
}
protected abstract int getLayoutResourceId();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectItem(position);
}
/** Swaps fragments in the main content view */
private void selectItem(int position) {
//Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
// args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
Intent intent = new Intent(MainActivity.this, ProductListActivity.class);
startActivity(intent);
}
}
public class ProductListActivity extends MainActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.options_menu, menu);
return true;
}
@Override
protected int getLayoutResourceId() {
// TODO Auto-generated method stub
return R.layout.activity_product_list;
}
Run Code Online (Sandbox Code Playgroud)
这是产品列表子类(activity_product_list.xml)的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ProductList" >
<include layout="@layout/activity_main"/>
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
Run Code Online (Sandbox Code Playgroud)
这是导航抽屉的布局(activity_main.xml):
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="300dp"
android:layout_height="500dp" >
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 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="#c3c3c3"/>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,但是如果我没有它,当我的子类调用抽象类的onCreate时,我得到空指针异常,在那里我想构建导航抽屉,它没有找到要设置的布局元素列表和布局(R.id.left_drawer或R.id.drawer_layout)!
Mic*_*ael 12
我也想弄清楚如何做到这一点.
我见过不正是你想要的一个很好的教程在这里.我们的想法是创建一个抽象活动类AbstractNavDrawerActivity,其中所有带抽屉的活动都将继承.此类使用NavDrawerActivityConfigurationbean类,该类包含有关导航器抽屉的所有信息,包括需要膨胀的布局
另一种方法是创建一个NavDrawerUtil类,您可以在其中放置与导航抽屉交互的静态方法.然后,您可以根据需要从每个活动中调用这些方法.
第二种方法为您提供了更大的灵活性,您不必担心布局通胀的顺序等等,但我认为这是一个不太清晰的解决方案, AbstractNavDrawerActivity因为带有导航抽屉的所有活动都像您建议的那样继承.
小智 1
我在以前的应用程序中所做的是将滑动菜单构建为抽象活动中的函数调用。当您设置一个扩展抽象活动的新活动时,您将在 onCreate() 中执行函数调用。我目前正在使用导航抽屉进行类似的实现,因此我不太确定它是否有效,但这可能是您开始的好地方。所有将调用导航抽屉的 Activity 都需要有一个 DrawerLayout 作为顶级布局元素。
| 归档时间: |
|
| 查看次数: |
19099 次 |
| 最近记录: |