1

我正在尝试创建一个扩展AppCompatActivity的Activity,并在其中有两个片段(一个在另一个之下 - 只是使用LinearLayout)。我想要第一个片段从support-v7库扩展PreferenceFragmentCompat类。无法让PreferenceFragmentCompat工作

我跟着Google关于PreferenceFragmentCompat的简短例子,如https://developer.android.com/reference/android/support/v7/preference/PreferenceFragmentCompat.html所示。

这里是我当前的代码:

GroupDetailsActivity.java

public class GroupDetailsActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_group_details); 

     GroupDetailsPrefFragment prefFragment = GroupDetailsPrefFragment.newInstance(); 
     GroupDetailsMembersFragment membersFragment = GroupDetailsMembersFragment.newInstance(); 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction() 
      .add(R.id.flPrefFragment, prefFragment, GroupDetailsPrefFragment.TAG) 
      .add(R.id.flMembersFragment, membersFragment, GroupDetailsMembersFragment.TAG) 
      .commit(); 
    } 
} 

GroupDetailsPrefFragment的.java - 有问题的片段

​​

GroupDetailsMembersFragment.java - 复合剂伊利空现在...

public class GroupDetailsMembersFragment extends Fragment { 

    public static final String TAG = "GroupDetailsMembersFragment"; 

    public static GroupDetailsMembersFragment newInstance() { 
     GroupDetailsMembersFragment fragment = new  GroupDetailsMembersFragment(); 
     return fragment; 
    } 
} 

activity_group_details.xml - 活动的布局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/flPrefFragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <FrameLayout 
     android:id="@+id/flMembersFragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 

group_details_preferences.xml - 偏好XML文件

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

    <Preference 
     android:title="@string/remove_me" 
     android:key="@string/pref_key_settings_remove_me"/> 
    <Preference 
     android:title="@string/delete_group" 
     android:key="@string/pref_key_settings_delete_group"/> 

</PreferenceScreen> 

试图编译和运行上面的代码导致我犯了一些错误,第一个是关于偏好主题t帽子没有设置。我已经快速扫描了互联网,发现您需要在活动主题中添加以下行:<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

为此,我需要将support-v14库添加到gradle!

试图再次运行代码,导致我到另一个错误,这是我张贴这个的原因,到目前为止我没有找到任何方法来解决这个问题。这里是崩溃日志:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cochat.android/com.cochat.android.ui.groups.details.GroupDetailsActivity}: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list_container' that is not a ViewGroup class 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
                     at android.app.ActivityThread.access$900(ActivityThread.java:161) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:157) 
                     at android.app.ActivityThread.main(ActivityThread.java:5356) 
                     at java.lang.reflect.Method.invokeNative(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:515) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
                     at dalvik.system.NativeStart.main(Native Method) 
                    Caused by: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list_container' that is not a ViewGroup class 
                     at android.support.v7.preference.PreferenceFragmentCompat.onCreateView(PreferenceFragmentCompat.java:269) 
                     at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) 
                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 
                     at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
                     at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
                     at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
                     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998) 
                     at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 
                     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607) 
                     at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) 
                     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1189) 
                     at android.app.Activity.performStart(Activity.java:5441) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)  
                     at android.app.ActivityThread.access$900(ActivityThread.java:161)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:157)  
                     at android.app.ActivityThread.main(ActivityThread.java:5356)  
                     at java.lang.reflect.Method.invokeNative(Native Method)  
                     at java.lang.reflect.Method.invoke(Method.java:515)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)  
                     at dalvik.system.NativeStart.main(Native Method)  

一直停留在这个有一段时间了,试图寻找向上的计算器或其他网站,看到了一些解决方案,不同岗位,但他们没有某种原因,设法解决我的问题。

编辑:

我gradle这个文件包含以下内容:

compileSdkVersion 25 
buildToolsVersion '25.0.2' 
... 
compile 'com.android.support:preference-v7:25.1.0' 
compile 'com.android.support:preference-v14:25.1.0' 

更新1月2日'17

我一直在寻找到的PreferenceFragmentCompat的源代码,看到它正在尝试加载以下布局:R.layout.preference_list_fragment。 在该类的onCreateView()方法中,它正在膨胀布局,并试图查找编号android.R.id.list_container。 问题是布局中没有这样的id。

下面是从PreferenceFragmentCompat的代码片段:

final View view = themedInflater.inflate(mLayoutResId, container, false); 

final View rawListContainer = view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER); 
if (!(rawListContainer instanceof ViewGroup)) { 
    throw new RuntimeException("Content has view with id attribute " 
       + "'android.R.id.list_container' that is not a ViewGroup class"); 
} 

虽然

private int mLayoutResId = R.layout.preference_list_fragment; 

还在寻找一个解决方案,谢谢!

回答

0

所以我找到了解决方法,可能不是最好的,但它是我设法开始工作的唯一的东西!这似乎是一个问题/支持库的错误..

我已将原始PreferenceFragmentCompat复制到本地类,并对其进行了轻微更改。我有

private int mLayoutResId = R.layout.preference_fragment_compat_container; 

这是我已经做了布局替换下面的行

private int mLayoutResId = android.support.v7.preference.R.layout.preference_list_fragment; 

,它非常简单,只包含名单的容器。下面是布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/list_container" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

做上述将允许您使用PreferenceFragmentCompat与上述特定gradle这个设置(见原帖)没有任何问题。

不好的一面是升级支持库不会升级您的PreferenceFragmentCompat,因为它当然是复制的。您需要跟踪支持库,并在问题解决后,您可以删除复制的类并使用原来的类。

如果您有任何其他解决方案或想法,请分享!

0

根据这一article

注意,谷歌从R.id.list_container改变所需要的ID(在 版本23.4.0)到android.R.id.list_container(修订中24.0.0 )。 Android Studio说新ID需要API 24,但它也适用于旧版API 。

的ViewGroup在布局文件(activity_group_details.xml)应具有ID“@android:ID/list_container”,使其工作,可以是这样的:。

<FrameLayout 
    android:id="@android:id/list_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

<FrameLayout 
    android:id="@+id/flMembersFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

而且你必须请注意,您的其他片段可以使用任何Id作为容器,只有pref是'特殊'

+0

嘿,我想你的解决方案,但事实并非如此工作,并导致相同的“java.lang.RuntimeException:内容的视图ID属性'android.R.id.list_container'不是一个ViewGroup类”,而且,IDE警告我该ID需要API级别24 ,而我的最小值是16 –

+0

现在不能真正想到任何东西,我会建议尝试使用支持库的版本它不时以不同的方式破裂。也许降级到24作为首发,只是一个想法 –

+0

另外,当试用这个解决方案时,我遇到了另一个问题。如果我想多个片段是首选片段 - 那么这两个容器应该使用@ android:id/list_container id这当然是不可能的,并导致重复的id错误。如果您阅读了我的最新更新,它似乎是支持库中的一个错误。仍然试图找到一个工作:) –

1

我过去,这使用以下修正: https://github.com/Gericop/Android-Support-Preference-V7-Fix

简单的3个步骤是更新应用程序的构建。gradle这个,
删除:

compile 'com.android.support:preference-v7:25.0.1' 
compile 'com.android.support:preference-v14:25.0.1' 

添加

compile 'com.takisoft.fix:preference-v7:25.0.1.0' 

然后更新应用的主题为喜好使用PreferenceFixTheme

(您已经在使用PreferenceFragmentCompat那么好走)。

UPDATE:
在进一步的调查,以API 25.1.0,程序兼容性工作得很好,一旦我意识到在风格偏好非常严格的限制。

我发现this resource非常有帮助的让一切设置很好:

0

我想你只需要使用支持PreferenceScreen和首选项:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

    <android.support.v7.preference.Preference 
     android:title="@string/remove_me" 
     android:key="@string/pref_key_settings_remove_me"/> 
    <android.support.v7.preference.Preference 
     android:title="@string/delete_group" 
     android:key="@string/pref_key_settings_delete_group"/> 

</android.support.v7.preference.PreferenceScreen>