具有抽象MainActivity的Android导航抽屉(调用活动)

时间:2013-07-28 12:18:02

标签: android navigation-drawer

我想要一个AbstractMainActivity来创建导航抽屉。在那里我还应该处理菜单项的点击,然后调用新的活动。在那些活动中,我想再次使用相同的导航抽屉。

我将使用AbstractMainActivity扩展Subclasses并以不同的方式调用每个子类的getLayoutResourceID(如此处所建议:android how to create my own Activity and extend it?)。

问题是,现在在我要构建导航抽屉的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;
}

这是产品列表子类(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>

这是导航抽屉的布局(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"/>

但是没有用,但如果我没有它,当我的子类调用抽象类的onCreate时,我得到空指针异常,我想在那里构建导航抽屉,它没有找到布局 - 用于设置列表和布局的元素(R.id.left_drawer或R.id.drawer_layout)!

2 个答案:

答案 0 :(得分:12)

我也想弄清楚如何做到这一点。

我已经看到了一个非常好的教程,它可以完全满足您的需求here。 我们的想法是创建一个抽象活动类AbstractNavDrawerActivity,其中所有带抽屉的活动都将继承。该类使用NavDrawerActivityConfiguration bean类,其中包含有关导航器抽屉的所有信息,包括需要膨胀的布局

另一种方法是创建一个NavDrawerUtil类,您可以在其中放置与导航抽屉交互的静态方法。然后,您可以根据需要从每个活动中调用这些方法。

第二种方法为您提供了更大的灵活性,您不必担心布局通胀的顺序等等,但我认为这是一个不那么干净的解决方案,而AbstractNavDrawerActivity的所有活动都带有导航抽屉像你建议的那样继承。

答案 1 :(得分:1)

我在之前的应用程序中所做的是在抽象活动中将一个滑动菜单构建为函数调用。当您设置一个扩展抽象活动的新Activity时,您将在onCreate()中执行函数调用。我目前正在使用导航抽屉进行类似的实现,所以我不确定它是否有效,但它可能是你开始的好地方。您调用导航抽屉的所有活动都需要将DrawerLayout作为顶级布局元素。