Как обернуть DrawerLayout вокруг PreferenceActivity в приложении для Android?

Я пишу приложение для 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>

Однако у меня много трудностей, чтобы обернуть DrawerLayout вокруг PreferenceActivity. PreferenceActivity - это особый вид деятельности, который я хотел бы сохранить, потому что он помогает мне сохранять внешний вид настроек Android в моем приложении; при этом он использует вызовы addPreferencesFromResource () для загрузки настроек и не использует вызовы addContentView () для загрузки файлов XML; Ресурсы предпочтений обычно содержат теги PreferenceScreen, которые не любят, когда их оборачивают в DrawerLayouts.

Кто-нибудь должен был иметь дело с этой проблемой, и как вы решили ее? Если у вас есть PreferenceActivity в вашем приложении для Android и у вас есть 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 (поскольку идентификатор "список" совпадает с ожидаемым действием Preference Activity); однако ящик не отображается. Как будто все, что находится под списком ListView, игнорируется.

1 ответ

Решение

Это заняло у меня некоторое время, но я смог сделать эту работу для своего приложения. Я не знаю, если это имеет значение, но я использую HoloEverywhere, поэтому я только предполагаю, что это будет работать на стандартном PreferenceActivity также.

В моем PreferenceActivity когда я отверг все версии setContentView() загрузить мой заказ DrawerLayout который похож на ваш и имеет ListView со стандартным идентификатором Android list, В последнем методе я обязательно позвонил onContentChanged() после того как я позвонил 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() создать все Headerс моей PreferenceScreens.

Другие вопросы по тегам