经过一些研究并获得建议后Ian Lake https://plus.google.com/u/0/116311379832695909648/posts/SRZrjGD1uhj,我设法让它发挥作用
- 更改自
AppCompatPreferenceActivity
, to AppCompatActivity
+PreferenceFragmentCompat
以下解决方案适用于 API 10 及更高版本。
JStockPreferenceActivity.java
public class JStockPreferenceActivity extends AppCompatActivity {
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jstock_preference_activity);
initToolbar();
if (savedInstanceState == null) {
// Display the fragment as the main content.
JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
this.getSupportFragmentManager().beginTransaction().replace(R.id.content, jStockPreferenceFragment).commit();
}
}
JStockPreferenceFragment.java
public class JStockPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
public static JStockPreferenceFragment newInstance() {
return new JStockPreferenceFragment();
}
然而,这样做有一个缺点。您之前的习惯DialogPreference
不再工作了。为了解决这个问题,你需要
- Replace
DialogPreference
with PreferenceDialogFragmentCompat
.
- Replace
DialogPreference
在 XML 中ListPreference
。 (我不太确定是否ListPreference
因为更换是正确的方法。无论如何它都有效)
- 手动显示
PreferenceDialogFragmentCompat
, in PreferenceFragmentCompat
's onPreferenceDisplayDialog
.
JStockPreferenceFragment.java
public class JStockPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
public static JStockPreferenceFragment newInstance() {
return new JStockPreferenceFragment();
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Showing custom dialog preference.
private void showPreferenceDialogFragmentCompat(PreferenceDialogFragmentCompat preferenceDialogFragmentCompat) {
preferenceDialogFragmentCompat.setTargetFragment(this, 0);
preferenceDialogFragmentCompat.show(this.getFragmentManager(), "android.support.v7.preference.PreferenceFragment.DIALOG");
}
private void showCurrencySymbolPreferenceDialogFragmentCompat(Preference preference) {
CurrencySymbolPreferenceDialogFragmentCompat currencySymbolPreferenceDialogFragmentCompat = CurrencySymbolPreferenceDialogFragmentCompat.newInstance(preference.getKey());
showPreferenceDialogFragmentCompat(currencySymbolPreferenceDialogFragmentCompat);
}
// Showing custom dialog preference.
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
// Callback when we are using custom dialog preference.
@Override
public Fragment getCallbackFragment() {
return this;
}
@Override
public boolean onPreferenceDisplayDialog(PreferenceFragmentCompat preferenceFragmentCompat, Preference preference) {
final String key = preference.getKey();
if (_CURRENCY_SYMBOL_OPTIONS.equals(key)) {
showCurrencySymbolPreferenceDialogFragmentCompat(preference);
return true;
}
return false;
}
// Callback when we are using custom dialog preference.
////////////////////////////////////////////////////////////////////////////////////////////////
CurrencySymbolPreferenceDialogFragmentCompat.java
public class CurrencySymbolPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
public CurrencySymbolPreferenceDialogFragmentCompat() {
}
public static CurrencySymbolPreferenceDialogFragmentCompat newInstance(String key) {
CurrencySymbolPreferenceDialogFragmentCompat fragment = new CurrencySymbolPreferenceDialogFragmentCompat();
Bundle b = new Bundle(1);
b.putString("key", key);
fragment.setArguments(b);
return fragment;
}
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
...
this.getPreference().setSummary(getSummary());
...
}
}
}
首选项.xml
<android.support.v7.preference.ListPreference
android:title="@string/preference_currency_symbol_title"
android:key="_CURRENCY_SYMBOL_OPTIONS" />
请注意,您需要在主题中添加以下项目。
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
关于主题的一些错误
然而,主题还不完美——PreferenceFragmentCompat 需要设置preferenceTheme https://stackoverflow.com/questions/32070670/preferencefragmentcompat-requires-preferencetheme-to-be-set
这是一个已知问题:https://code.google.com/p/android/issues/detail?id=183376 https://code.google.com/p/android/issues/detail?id=183376
有建议的解决方法https://stackoverflow.com/a/32108439/72437 https://stackoverflow.com/a/32108439/72437但是,该解决方法仅适用于 v14 及更高版本,不适用于 v7 及更高版本。