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>