7

Drawer Layout 機能を利用する Android アプリを作成しています。アプリ全体で使用できるナビゲーション ツールとして Drawer Layout を使用できるようにしたいと考えています。Drawer Layout を使用するために、アクティビティ レイアウト 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 -->
    <LinearLayout
        android:id="@+id/main_content_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/navigational_drawer"
        android:layout_width="220dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#FFFFFF"/>
</android.support.v4.widget.DrawerLayout>

ただし、PreferenceActivity の周りに DrawerLayout をラップするのは非常に困難です。PreferenceActivity は、アプリで Android 設定のルック アンド フィールを維持するのに役立つため、保持したい特別な種類のアクティビティです。つまり、addPreferencesFromResource() 呼び出しを使用して設定をロードし、addContentView() 呼び出しを使用して XML ファイルをロードしません。通常、設定リソースには、DrawerLayout にラップされたくない PreferenceScreen タグが含まれています。

誰かがその問題に対処しなければなりませんでしたが、どのように解決しましたか? Android アプリに PreferenceActivity があり、同じアクティビティで DrawerLayout を使用できる場合は、その方法を共有してください。どんな助けでも大歓迎です。

編集済み:私が変更した場合

<!-- The main content view -->
<LinearLayout
    android:id="@+id/main_content_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<ListView 
     android:id="@android:id/list"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent" />

その後、PreferenceActivity がロードされてもアプリはクラッシュしません (ID の「リスト」が Preference アクティビティが期待しているものと一致するため)。ただし、ドロワーは表示されません。ListView の「リスト」の下にあるものはすべて無視されているようです。

4

1 に答える 1

2

これにはしばらく時間がかかりましたが、アプリでこれを機能させることができました。それが違いを生むかどうかはわかりませんが、私は を使用してHoloEverywhereいるので、これは標準PreferenceActivityでも機能すると思います。

私のPreferenceActivity場合、 のすべてのバージョンをオーバーライドして、あなたのようなsetContentView()カスタムをロードし、 の標準の Android ID を持っています。最後のメソッドでは、呼び出した後に必ず呼び出すようにしました:DrawerLayoutListViewlistonContentChanged()super.setContentView()

@Override
public void setContentView(int layoutResID)
    {
    setContentView( getLayoutInflater().inflate( layoutResID ) );
    }

@Override
public void setContentView(View view)
    {
    setContentView( view, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT ) );
    }

@Override
public void setContentView(View view, LayoutParams params)
    {

    // inflate the drawer layout

    super.setContentView( R.layout.navigation_drawer_base_layout );

    DrawerLayout dl = findViewById(R.id.drawer_layout);

    // do stuff here initialize the DrawerLayout like add a DrawerToggle, etc

    ...STUFF

    // Call onContentsChanged() to let the Activity know it needs to refresh itself.

    onContentChanged();

    }

私はonBuildHeaders()まだ、さまざまなのloadHeadersFromResource()すべての を作成するように呼び出しています。HeaderPreferenceScreen

于 2013-09-24T20:01:30.667 に答える