mor*_*ium 16 android preferenceactivity android-3.0-honeycomb
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
在Android 3.0中,事情发生了变化,使用片段实现了Preferences.这就是我的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>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行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
Run Code Online (Sandbox Code Playgroud)
我知道导致这个问题的原因.FragmentManager只是找不到一个视图来插入片段GeneralSettingsFragment.但我不知道如何解决它.
顺便说一下,如果我在Android 4.0上运行相同的应用程序,那么我可以看到第一个带标题的Preference Activity.但如果我点击General,应用程序将崩溃,我将在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)
Run Code Online (Sandbox Code Playgroud)
我遇到了和你相同的问题.
我尝试了很多东西,但这里是我的完整代码:
https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java
诀窍是在onBuildHeaders部分添加setContentView,但不在onCreate中.
我也在片段中进行了一些测试,并不完全确定为什么这样做,但我保证:我在平板电脑标题部分有自定义布局!
归档时间: |
|
查看次数: |
12491 次 |
最近记录: |