【问题标题】:PreferenceActivity with multiple PreferenceScreens without Headers具有多个不带标题的 PreferenceScreens 的 PreferenceActivity
【发布时间】:2016-03-08 18:50:40
【问题描述】:

我想做一个普通的 PreferenceActivity(旧样式,没有标题),但是有片段并且不使用 addPreferencesFromResource(id)(因为弃用)。
现在我通过将它放在我的onCreate 中实现了这一点:

getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit();

我的PreferencesFragment 看起来像这样:

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

显然我也实现了isValidFragment方法:

@Override
protected boolean isValidFragment(String fragmentName) {
    return PreferencesFragment.class.getName().equals(fragmentName)
            || InnerFragment.class.getName().equals(fragmentName);
}

而且它工作得很好。但是,在我的preferences.xml 中包含PreferenceScreen 时会出现问题:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <!--  ...  -->
    <PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
        android:summary="@string/settings_activity_prefs_display_night_mode_sum"
        android:title="@string/settings_activity_prefs_display_night_mode" />
    <!--  ...  -->
</PreferenceScreen>

我有以下问题:新的首选项屏幕显示在正常屏幕之上,我知道这可能是因为我替换了默认的R.id.content。截图:

但是,我想在不使用已弃用的内容或标头的情况下解决此问题。有可能实现吗?

【问题讨论】:

    标签: android preferenceactivity preferencescreen preferencefragment


    【解决方案1】:

    只需使用PreferenceActivity.EXTRA_SHOW_FRAGMENT 和PreferenceActivity.EXTRA_NO_HEADERS 只显示一个片段并跳过标题:

    //Note #1: ExtendedPreferenceActivity extends PreferenceActivity 
    //Note #2: ExtendedPreferenceFragment extends PreferenceFragment and is 
    //declared as an inner static class in ExtendedPreferenceActivity
    Intent intent = new Intent(context, ExtendedPreferenceActivity.class );
    intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, ExtendedPreferenceActivity.ExtendedPreferenceFragment.class.getName() );
    intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true );
    startActivity(intent);
    

    【讨论】:

      【解决方案2】:

      我自己发现了解决方案。如果我不打算制作基于片段、基于标头的 SettingsActivity,但仍不想使用已弃用的方法,那么我必须完全不使用片段,除了用于替换主视图的片段。换句话说,我必须删除InnerFragment,所以我也可以删除isValidFragment 方法。我将另一个 XML 文件中的所有代码都移到了第一个,如下所示:

      第一个文件(旧):

      <?xml version="1.0" encoding="utf-8"?>
      <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
          <!--  ...  -->
          <PreferenceScreen android:fragment="net.chaozspike.batterynotifier.SettingsActivity$InnerFragment"
              android:summary="@string/settings_activity_prefs_display_night_mode_sum"
              android:title="@string/settings_activity_prefs_display_night_mode" />
          <!--  ...  -->
      </PreferenceScreen>
      

      第一个文件(新):

      <?xml version="1.0" encoding="utf-8"?>
      <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
          <!--  ...  -->
          <PreferenceScreen android:summary="@string/settings_activity_prefs_display_night_mode_sum"
              android:title="@string/settings_activity_prefs_display_night_mode" >
              <!-- Contents of second file here>
              <CheckBoxPreference /> etc.
          </PreferenceScreen>
          <!--  ...  -->
      </PreferenceScreen>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 2013-06-22
        • 2016-08-04
        • 1970-01-01
        相关资源
        最近更新 更多