我在ActionBar中选择“首选项”选项后,我试图显示PreferenceFragment
。
但是,在使用PreferenceFragment
替换当前内容后,您可以看到其下方的旧内容。如同,您可以直接看到偏好。
我在这里遗漏了什么吗?我使用了我自己的一本书中的一个例子,它没有使用任何布局文件作为首选项。你需要那些吗?
使用过的代码:
操作栏菜单
private boolean MenuChoice(MenuItem item) {
switch (item.getItemId()) {
case 0:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
ReaderPreferences prefs = new ReaderPreferences();
fragmentTransaction.replace(android.R.id.content, prefs);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
return true;
}
return false;
}
PreferenceReader
public class ReaderPreferences extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// --load the preferences from an XML file---
addPreferencesFromResource(R.xml.preference);
}
}
实际结果:
正如您所看到的,您直接了解我的偏好。 我做错了什么?
答案 0 :(得分:8)
像这样创建 PreferenceFragment.java 类:
public class UserPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getView().setBackgroundColor(Color.BLACK);
getView().setClickable(true);
}
}
诀窍是:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getView().setBackgroundColor(Color.BLACK);
getView().setClickable(true);
}
修改强>
按照JDenais的建议编辑,即使对主题不是非常必要。
答案 1 :(得分:6)
我遇到了同样的问题并解决了它//无需开始新活动//此方法的优点是您的主要活动不会经历暂停 - 恢复周期。关键是将主UI作为片段,然后在调用Pref片段时隐藏它。主要片段可以静态或动态包含。
FragmentTransaction ft = getFragmentManager().beginTransaction();
AppSettingsFragment prefs = new AppSettingsFragment();
// This adds the newly created Preference fragment to my main layout, shown below
ft.add(R.id.main_layout,prefs);
// By hiding the main fragment, transparency isn't an issue
ft.hide(mMyMainFragment);
ft.addToBackStack(null);
ft.commit();
main_layout.xml
看起来像:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- Uncomment for static fragment inclusion -->
<!-- fragment android:name="com.legynd.ui.MyMainFragment"
android:id="@+id/mainfragment"
android:layout_width="match_parent"
android:layout_height="match_parent" / -->
</RelativeLayout>
答案 2 :(得分:6)
最佳和最便携的解决方案已获得回复here
这是:
将以下代码添加到PreferenceFragment中 让你添加背景颜色,图像等。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
view.setBackgroundColor(getResources().getColor(android.R.color.your_color));
return view; }
答案 3 :(得分:2)
在您的ReaderPreferences实现中添加:
public void onResume() {
super.onResume();
getView().setBackgroundColor(Color.WHITE);
}
答案 4 :(得分:2)
为您的活动使用空布局,如下所示:
<强> activity_settings.xml 强>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/settingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
然后在活动的onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
ReaderPreferences mReaderPreferences = new ReaderPreferences ();
getSupportFragmentManager().beginTransaction()
.replace(R.id.settingsFragment, mReaderPreferences ).commit();
}
答案 5 :(得分:1)
背景颜色可以设置为onStart()中的片段视图。 如下:
{{1}}
这适用于我的所有测试设备。
接受的答案不是问题所在的答案。实际上,它是一种为偏好片段创建容器活动的解决方法。
答案 6 :(得分:1)
在扩展PreferenceFragment的片段中添加它:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
view.setBackgroundColor(getResources().getColor(android.R.color.white));
return view;
}
答案 7 :(得分:0)
最终通过一个非常简单的修复来修复它。
我只是在新的PreferenceFragment
中调用了Intent
,它完美无缺。
对于有同样问题的人:
<强> Prefs.java 强>
public class ReaderPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// --load the preferences from an XML file---
addPreferencesFromResource(R.xml.preference);
}
按下按钮时在我的主屏幕中:
Intent i = new Intent(this, Prefs.class);
startActivity(i);
这就是全部。设置首选项后,只需按后退按钮即可完成。
答案 8 :(得分:0)
我也遇到了同样的问题,在尝试了几件事之后我发现它发生了,因为在我的情况下,我混淆了两个不同版本的Fragments和FragmentManagers。
我的MainActivity的onCreate看起来像这样:
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
但是当我想用我自己的PreferenceFragment替换这个MainFragment时,我尝试使用类似你使用的东西:
getFragmentManager().beginTransaction()
.replace(R.id.container, new SettingsFragment())
.addToBackStack(null)
.commit();
我理解的方式是,你应该使用相同类型的FragmentManager替换工作,所以我必须继续对我连接MainFragment的方式进行适当的修改,使它看起来像这样: / p>
getFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
当然,我不得不重构MainFragment以从android.app.Fragment
而不是android.support.v4.app.Fragment
延伸
答案 9 :(得分:0)
我尝试了Shayan_Aryan的解决方案,但我的应用程序因错误而死机:
Your content must have a ListView whose id attribute is 'android.R.id.list'
所以我必须在空的情况下创建一个没有文本的LinearLayout。 好吧,我想有一个更优雅的解决方案,但这是唯一对我有用的解决方案。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ListView android:id="@+id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView android:id="@+id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
</LinearLayout>
答案 10 :(得分:0)
我使用了很多技术,但没有获得任何成果 最后我通过添加容器的背景或像这样的片段布局来修复它
android:background="@android:color/white"
您只需添加您的布局或片段的容器视图 希望它会有所帮助