6

Navigation Drawer を作成する AbstractMainActivity が必要です。そこでは、メニュー項目のクリックも処理してから、新しいアクティビティを呼び出す必要があります。それらのアクティビティでは、同じナビゲーション ドロワーを再び使用したいと考えています。

AbstractMainActivity を使用してサブクラスを拡張し、各サブクラスとは異なる方法で getLayoutResourceID を呼び出します (ここで提案されているように: android how to create my own Activity and extend it? )。

問題は、Navigation Drawer を構築したい AbstractMainActivity で、Navigation Drawer レイアウト (xml) 要素にアクセスできないことです。もちろん、サブクラスには別の基本レイアウトが必要なためです。

すべてのサブクラスのレイアウト ファイルに「レイアウトを含める」必要がありますか? しかし、これは機能しません。Navigation Drawer で Fragments の代わりに Activity を使用したい場合、何が間違っていますか?

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"/>

しかし、それは機能しませんが、それがない場合、Navigation Drawer を構築したい抽象クラスの onCreate をサブクラスが呼び出すと、null ポインター例外が発生し、設定するレイアウト要素が見つかりません。リストとレイアウト (R.id.left_drawer または R.id.drawer_layout)!

4

2 に答える 2

12

また、これを行う方法を理解しようとしています。

ここであなたが望むことを正確に行う非常に優れたチュートリアルを見てきました。AbstractNavDrawerActivityアイデアは、ドロワーを持つすべてのアクティビティが継承する抽象アクティビティ クラスを作成することです。このクラスは、NavDrawerActivityConfigurationインフレートする必要があるレイアウトを含むナビゲーション ドロワーに関するすべての情報を保持する Bean クラスを使用します。

もう 1 つの方法はNavDrawerUtil、ナビゲーション ドロワーと対話する静的メソッドを配置するクラスを作成することです。その後、必要に応じて各アクティビティからこれらのメソッドを呼び出します。

2番目のアプローチは柔軟性が高く、レイアウトのインフレーションの順序などを心配する必要はありませんが、 AbstractNavDrawerActivityナビゲーションドロワーを使用したすべてのアクティビティがあなたが提案したように継承するという最初の方法よりもクリーンなソリューションではないと思います.

于 2013-09-09T08:13:51.227 に答える
1

私が以前のアプリで行ったことは、抽象的なアクティビティで関数呼び出しとして作成されたスライド メニューを使用することです。抽象アクティビティを拡張する新しいアクティビティをセットアップするときは、onCreate() で関数呼び出しを実行します。私は現在、Navigation Drawer を代わりに使用して同様の実装に取り​​組んでいるので、まだうまくいくかどうかはわかりませんが、始めるには良い場所かもしれません. Navigation Drawer を呼び出すすべてのアクティビティには、最上位のレイアウト要素として DrawerLayout が必要です。

于 2013-07-31T18:50:40.160 に答える