【问题标题】:PreferenceFragment is shown transparentlyPreferenceFragment 透明显示
【发布时间】:2012-01-11 20:53:59
【问题描述】:

在我的 ActionBar 中选择 Preferences 选项后,我试图显示 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);
    }
  }

实际结果:

如您所见,您可以直接查看我的偏好。 我做错了什么?

【问题讨论】:

  • 我也有同样的问题。有没有解决方案让它与 PreferenceFragments 而不是 PreferenceActivity 一起工作?

标签: android android-fragments android-preferences


【解决方案1】:

我用了很多技巧但没有收获
最后我通过添加容器的背景或像这样的片段布局来修复它

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

您只需要在您的 Layout 或 Fragment 的容器视图中添加
希望对你有帮助

【讨论】:

    【解决方案2】:

    将此添加到扩展 PreferenceFragment 的 Fragment 中:

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

    【讨论】:

      【解决方案3】:

      背景颜色可以在onStart()中设置为Fragment View。 如下:

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

      这适用于我的所有测试设备。

      接受的答案不是这里问题的答案。事实上,它是一种为偏好片段创建容器活动的解决方法。

      【讨论】:

        【解决方案4】:

        像这样创建您的 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 的建议进行编辑,即使对于主题而言并非绝对必要。

        【讨论】:

        • 我建议你也添加:getView().setClickable(true);以防止点击通过片段并意外点击下面的活动。
        • 如果对旧 API 使用 PreferenceActivity,尽管有 PreferenceFragment,但应将 onActivityCreated(savedInstanceState) 更改为 onResume() 并将 getView 更改为 getListView
        【解决方案5】:

        最佳和最便携的解决方案回答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; }
        

        【讨论】:

          【解决方案6】:

          我尝试了 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> 
          

          【讨论】:

            【解决方案7】:

            我也遇到了完全相同的问题,在尝试了几件事后,我发现它正在发生,因为在我的情况下,我混合了两个不同版本的 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 的方式进行适当的更改,使其看起来像这样:

            getFragmentManager().beginTransaction()
                        .add(R.id.container, new MainFragment())
                        .commit();
            

            当然,我必须重构 MainFragment 以从 android.app.Fragment 扩展而不是 android.support.v4.app.Fragment

            【讨论】:

              【解决方案8】:

              为您的活动使用空布局,如下所示:

              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>
              

              然后在activity的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();
                  }
              

              【讨论】:

              • 当您在 commit(); 之前还包含 .addToBackStack(null) 时,这似乎是一个合理的解决方案;
              【解决方案9】:

              在您的 ReaderPreferences 实现中添加:

              public void onResume() {
                  super.onResume();
                  getView().setBackgroundColor(Color.WHITE);
              }
              

              【讨论】:

                【解决方案10】:

                我遇到了同样的问题并解决了它//无需开始新的活动//。此方法的优点是您的主要活动不会经历暂停-恢复周期。关键是将您的主 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>
                

                【讨论】:

                  【解决方案11】:

                  最终通过一个非常简单的修复方法修复了它。

                  我只是在新的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);
                  

                  就是这样。设置好首选项后,只需按返回按钮即可。

                  【讨论】:

                  • 如果您使用 PreferenceActivity,此解决方案可以正常工作,但是,您不能将此方法与 PreferenceFragment 一起使用。您说您通过 Intent 调用 PreferenceFragment,但在 Prefs.java 的解决方案中,您使用的是 PreferenceActivity 而不是 PreferenceFragment。
                  猜你喜欢
                  • 1970-01-01
                  • 2011-06-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-11-28
                  • 2015-12-01
                  • 2016-09-17
                  • 2016-12-02
                  • 2013-03-30
                  相关资源
                  最近更新 更多