android - 如何在 Android 3.0 中为 PreferenceActivity 设置自定义布局?

标签 android android-3.0-honeycomb preferenceactivity

我正在使用 minSdkVersion="11"开发应用程序,即适用于平板电脑和 Android 4.0 及更高版本的应用程序。我已经在这个主题上仔细检查了互联网,但没有找到太多。

要为以前版本的 Android SDK 实现自定义布局,我们只需使用 ListView 创建布局(比如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 中,情况发生了变化,首选项是通过使用 fragment 来实现的。这就是我的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 只是找不到插入 fragment GeneralSettingsFragment 的 View 。但我不知道如何解决。

顺便说一句,如果我在 Android 4.0 上运行相同的应用程序,那么我可以看到第一个带有标题的 Preference Activity。但是如果我点击常规,应用程序会崩溃,我会在 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)

最佳答案

我和你有同样的问题。

我尝试了很多东西,但这是我的完整代码:

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

诀窍是在 onBuildHeaders 部分中添加 setContentView,而不是在 onCreate 中。

我还在 fragment 中进行了一些测试,但不确定为什么会这样,但我向你保证:我在平板电脑标题部分有一个自定义布局!

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

关于android - 如何在 Android 3.0 中为 PreferenceActivity 设置自定义布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7846855/

相关文章:

android - 从(子)PreferenceScreen 返回时更新 PreferenceActivity 中现有的 Preference-item

java - 单击复选框时显示图像数组列表

安卓 : Open google play dialog from my app

android - 联系人组列表的隐式 Intent

android - 禁用布局宽度和高度自动导入功能和建议

android - ActionBar 中的 ProgressBar,例如带有 Refresh 的 GMail 应用程序

android - 来自 ListFragment 的 startActivityForResult 似乎没有调用 onActivityResult

android - 在 Android Honeycomb 中设置操作栏样式

android - 在 PreferenceActivity 中获取根 ViewGroup

android - 在 EditTextPreference 中禁用对话框,改为启动 Intent