如何在 Android 应用程序中将 DrawerLayout 包装在 PreferenceActivity 周围?

7

我正在编写一款Android应用程序,以利用抽屉布局功能。我希望能够在整个应用程序中使用抽屉布局作为导航工具。为了使用抽屉布局,我在我的活动布局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标签,这些标签不喜欢被包裹在DrawerLayout中。

有没有人遇到过这个问题,你是如何解决的?如果你的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 Activity期望找到的内容),那么一切正常;然而,抽屉并没有显示出来。好像ListView “list” 下面的所有内容都被忽略了。


我也想保留我的现有活动并动态添加抽屉。不是因为PreferenceActivity,而是因为有近100个活动,将它们全部更改为片段需要一些时间。我能够使用HorizontalScrollView做到这一点,但我觉得DrawerLayout会更加清晰。 - Erik B
1个回答

2
这个花了我一些时间,但最终我成功地将其应用到我的应用程序中。我不知道是否有所不同,但我使用的是 HoloEverywhere,所以我只能假设这也适用于标准的 PreferenceActivity
在我的 PreferenceActivity 中,当我重写了所有版本的 setContentView() 以加载我的自定义 DrawerLayout(与您的类似,并且具有标准 android id 的 ListView),在最后一个方法中,我确保在调用 super.setContentView() 后调用了 onContentChanged()
@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() 来为不同的 PreferenceScreen 创建所有的 Header

谢谢Jon。我早就开始实现自己的Activity来模仿PreferenceActivity的外观和感觉了。我会将您的回复标记为“已解答”。 - CocoaAficionado
@jon,我按照你在这里写的代码实现了相同的代码,但它没有工作,你能帮我吗?这是我的问题链接:http://stackoverflow.com/questions/37629855/how-to-set-navigation-drawer-in-preferenceactivity - Sagar Chavada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接