PreferenceFragment透明显示

时间:2011-12-02 21:28:55

标签: android android-fragments android-preferences

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

实际结果:

enter image description here

正如您所看到的,您直接了解我的偏好。 我做错了什么?

11 个答案:

答案 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"    

您只需添加您的布局或片段的容器视图 希望它会有所帮助