1

我愿做一个正常的PreferenceActivity(旧风格,无头),但与片段,并且不使用addPreferencesFromResource(id)(因为折旧)。
现在,我通过把这个在我onCreate实现这一点:PreferenceActivity多PreferenceScreens无头

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

它工作得很好。然而,在内部具有PreferenceScreen的时候有一个问题我preferences.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> 

我有以下问题:新的优先级屏幕显示在正常的顶部,我知道这可能是因为我更换了默认R.id.content。截图:

screenshot not loding

但是我想不使用过时的东西或标题来解决这个问题。这有可能实现吗?

回答

1

我自己发现了解决方案。如果我不打算创建基于片段的,基于标头的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> 
6

只需使用PreferenceActivity.EXTRA_SHOW_FRAGMENTPreferenceActivity.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);