PreferenceFragment透明显示

12

我正在尝试在ActionBar中选择"Preferences"选项后展示一个PreferenceFragment。然而,在使用PreferenceFragment替换当前内容后,您可以看到其下方的旧内容,也就是说您可以透过首选项看到旧内容。

这里我有什么遗漏吗?我使用了一本书中的示例,其中没有使用任何布局文件来处理首选项。您需要它们吗?

代码:

Actionbar菜单

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);
    }
  }

实际结果:

输入图像描述

如您所见,我的偏好被完全忽略了。我做错了什么?


我有同样的问题。没有办法使用PreferenceFragments而不是PreferenceActivity来解决它吗? - axooh
11个回答

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的建议进行了编辑,尽管这并不是严格需要的话题。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - JDenais
如果在旧的API中使用PreferenceActivity而不是PreferenceFragment,则应将onActivityCreated(savedInstanceState)更改为onResume(),将getView更改为getListView - Elia12345

6

最好且最便携的解决方案在这里给出了答案。

方法如下:

将以下代码添加到您的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; }

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
在您的ReaderPreferences实现中添加以下内容:
public void onResume() {
    super.onResume();
    getView().setBackgroundColor(Color.WHITE);
}

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();
    }

1
在 commit() 之前加入 .addToBackStack(null) 看起来是一个合理的解决方案。 - GregM

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;
}

1

背景颜色可以在onStart()方法中设置Fragment视图。

如下所示:

public class ReaderPreferences extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preference);
}

@Override
public void onStart() {
   super.onStart();
   View v = getView();
   v.setBackgroundColor(getActivity().getResources.getColor(R.color.my_color));
}

这对我在所有测试设备上都有效。
接受的答案并不是这里问题的答案。实际上,它是一种解决方法,为首选项片段创建一个容器活动。

0

我尝试了许多技巧,但都没有收获。
最终,我通过像这样添加容器或片段布局的背景来解决了问题。

android:background="@android:color/white"    

你只需要在你的布局或Fragment的容器视图中添加它
希望能对你有所帮助


0
最终我用一个非常简单的方法解决了它。
我只是在一个新的Intent中调用了PreferenceFragment,然后它完美地工作了。
对于有同样问题的人:

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);

就这样了。设置完偏好后,只需按返回按钮即可完成。


9
如果您使用的是PreferenceActivity,此解决方案可以很好地工作。但是,您无法在PreferenceFragment中使用此方法。您说您正在通过Intent调用PreferenceFragment,但在Prefs.java中的解决方案中,您正在使用PreferenceActivity而不是PreferenceFragment。 - digiphd

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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接