7

我正在编写一个Android应用程序以利用抽屉布局功能。我希望能够将Drawer Layout作为整个应用程序中可用的导航工具。要使用抽屉布局,我用我的活动布局的XML文件如下:如何在Android应用程序中围绕PreferenceActivity包装DrawerLayout?

<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文件;首选项资源通常包含不喜欢包装在DrawerLayouts中的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“列表”匹配什么偏好活动期待的应用程序不会崩溃找);然而,抽屉没有显示。这几乎就好像ListView“list”下面的所有内容都被忽略了一样。

+0

我也想保留我现有的活动并动态添加抽屉。不是因为PreferenceActivity,而是因为有将近100个活动并将它们全部更改为碎片需要一段时间。我能够用Horizo​​ntalScrollView来做到这一点,但我觉得DrawerLayout会更干净。 –

回答

2

这一个花了我一段时间,但我能够使我的应用程序的这项工作。我不知道它是否有所作为,但我使用的是HoloEverywhere,所以我只假设这也适用于标准PreferenceActivity

在我PreferenceActivity当我推翻的setContentView()所有版本加载我自定义DrawerLayout这是像你这样的,并具有与list标准Android ID的ListView。在过去的方法,我就确定调用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()为我的不同PreferenceScreen S创建所有Header秒。

+0

谢谢乔恩。我很久以前就开始实施我自己的Activity来模仿PreferenceActivity的外观和感觉。我会将您的回复标记为“已回答”。 – CocoaAficionado

+0

@jon我执行相同的代码,因为你写在这里,但它不工作,你能帮我plz,这是我的问题:http://stackoverflow.com/questions/37629855/how-to-set-navigation-drawer -in-preferenceactivity –