2011-10-21 109 views
16

我开发的应用程序具有的minSdkVersion =“11”,这是为平板电脑和Android 4.0及更高版本的应用程序。我在这个话题上审查了互联网,但没有发现太多。android - 如何在Android 3.0中设置PreferenceActivity的自定义布局?

要使用ListView控件实现对Android的SDK的早期版本中,我们只需要创建布局(比如preference.xml)的自定义布局和其ID等于android.R.id.list和使用的setContentView方法。

preference.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <ListView android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" /> 
</RelativeLayout> 

在Android 3.0的事情发生了变化,偏好和使用片段的实现。这是我preference_headers.xml文件看起来像:

<preference-headers 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

    <header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment" 
      android:title="General" 
      android:summary="Common settings." /> 
    <header 
      android:title="Example.com" > 
     <intent android:action="android.intent.action.VIEW" 
       android:data="http://www.example.com" /> 
    </header> 

</preference-headers> 

MyPreferenceActivity.java:

public class MyPreferenceActivity extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.preference); 
     // Add a button to the header list. 
     if (hasHeaders()) { 
      Button button = new Button(this); 
      button.setText("Log out"); 
      setListFooter(button); 

     } 

    } 


    /** 
    * Populate the activity with the top-level headers. 
    */ 
    @Override 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.preference_headers, target); 
    } 

    public static class GeneralSettingsFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.fragmented_preferences); 

     } 
    } 
} 

现在,如果我跑MyPreferenceActivity我会看到这个错误的logcat:

> java.lang.IllegalArgumentException: No view found for id 0x10202be for 
> fragment GeneralSettingsFragment{4077f8c0 #0 id=0x10202be} 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:729) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584) 
> E/AndroidRuntime(17103): at 
> android.app.Activity.performStart(Activity.java:4377) 
> E/AndroidRuntime(17103): at 
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1724) 
> E/AndroidRuntime(17103): ... 11 more 

我知道是什么原因导致此问题FragmentManager找不到插入片段GeneralSettingsFragment的视图,但我不知道如何解决它。

顺便说一句,如果我上运行的Android 4.0相同的应用程序,然后我可以看到标题的第一选择活动。但是,如果我点击通用,应用程序会崩溃,我会在logcat中收到类似的错误:

java.lang.IllegalArgumentException: No view found for id 0x10202cd for fragment GeneralSettingsFragment{4134b4e0 #0 id=0x10202cd} 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:789) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998) 
E/AndroidRuntime(2170):  at android.app.BackStackRecord.run(BackStackRecord.java:622) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330) 
E/AndroidRuntime(2170):  at android.app.Activity.performStart(Activity.java:4474) 
E/AndroidRuntime(2170):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928) 
+0

你想做什么?为什么你需要一个自定义布局? – alexanderblom

+0

我想更精确地控制偏好活动。此外,我希望它尽可能与新版本的Android SDK兼容,那就是我需要扩展PreferenceActivity,但不能从头开始实现它。 – morphium

回答

-1

你不需要setContenView。在这个例子中,布局总体是通过标题和相关的片段完成的,另一个词是自动完成的。

+0

我知道我不需要它。但在这个例子中,我将Button添加到列表页脚。现在我想更精确地定制视图。也许通过在活动顶部添加徽标等等,也就是说,我需要它。我只是不明白,有很多Pre-Android 3.0应用程序的PreferenceActivity自定义示例和教程。是否无法使API SDK大于10? – morphium

2

我尝试此代码为我的应用程序

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory android:title="@string/PreferencesActivity.GeneralSettingsCategoryTitle"> 
     <Preference 
      android:title="yor title" 
      android:summary="your summary" 
      android:key="key to access preference" />  
     <Preference 
      android:title="@string/" 
      android:summary="@string/" 
      android:key="key2" /> 
     <PreferenceScreen 
      android:key="key3" 
      android:title="@string/" 
      android:summary="@string/"> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="false" 
       android:summary="@string/" 
       android:key="key4" /> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="true" 
       android:summary="@string/" 
       android:key="key5" /> 

      <ListPreference 
       android:title="@string/" 
       android:summary="@string/" 
       android:key="key6" 
       android:defaultValue="buttons" 
       android:entries="@array/" 
       android:entryValues="@array/" /> 
      .... 


       </prefefenceScreen> 
     </preferenceCategory> 
</preferenceScreen> 



enter code here 
5

我有同样的问题比你。

我尝试了很多东西,但这里是我的全码:

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java

诀窍是添加的setContentView在onBuildHeaders部分,但不是在OnCreate。

我也做了一些片段测试和不完全知道为什么,这是工作,但我向你保证:我对平板电脑标题部分中的自定义布局!

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/view/StockPreferenceFragment.java

+5

链接被破坏 – Dave

+0

链接被破坏,但我能够找到它:https://github.com/iRail/BeTrains-for-Android/blob/master/BeTrains/src/main/java/tof/cv/ mpp/MyPreferenceActivity.java – Glaucus

+0

但是,我没有在onBuildHeaders中看到对setContentView的调用。所以不知道该怎么想。 – Glaucus