通过 AppCompatPreferenceActivity 将工具栏添加到 PreferenceActivity 会导致重叠

2024-03-26

我曾经经历过如何将工具栏添加到AppCompat PreferenceActivity? https://stackoverflow.com/questions/30114730/how-to-use-appcompatpreferenceactivity

我在用着appcompat-v7:23.0.1 and support-v4:23.0.1

使用前AppCompayPreferenceActivity, my PreferenceActivity看起来没有工具栏如下。

没有工具栏

public class JStockPreferenceActivity extends PreferenceActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            // Display the fragment as the main content.
            JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
            jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
            this.getFragmentManager().beginTransaction().replace(android.R.id.content, jStockPreferenceFragment).commit();
    }
}

使用后AppCompayPreferenceActivity, 和一些Toolbar初始化代码,结果如下

结果并不如预期:-

  1. The Toolbar重叠于PreferenceFragment
  2. 当触摸到Toolbar,该事件将被消耗PreferenceFragment。这意味着,当您触摸工具栏时,将触摸“表格标题”首选项。

带工具栏

public class JStockPreferenceActivity extends AppCompatPreferenceActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            // Display the fragment as the main content.
            JStockPreferenceFragment jStockPreferenceFragment = JStockPreferenceFragment.newInstance();
            jStockPreferenceFragment.setArguments(this.getIntent().getExtras());
            this.getFragmentManager().beginTransaction().replace(android.R.id.content, jStockPreferenceFragment).commit();
        }
        initToolbar();
    }

    private void initToolbar() {
        Toolbar toolbar;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            ViewGroup root = (ViewGroup) findViewById(android.R.id.list).getParent().getParent().getParent();
            toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar, root, false);
            root.addView(toolbar, 0);
        } else {
            toolbar = null;
        }

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

我的工具栏是

工具栏.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >

    <!-- android:elevation="4dp" is used due to http://www.google.com/design/spec/what-is-material/elevation-shadows.html#elevation-shadows-elevation-android- -->

</android.support.v7.widget.Toolbar>

我在想,我做错了什么,导致Toolbar重叠于PreferenceFragment


经过一些研究并获得建议后Ian Lake https://plus.google.com/u/0/116311379832695909648/posts/SRZrjGD1uhj,我设法让它发挥作用

  1. 更改自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不再工作了。为了解决这个问题,你需要

  1. Replace DialogPreference with PreferenceDialogFragmentCompat.
  2. Replace DialogPreference在 XML 中ListPreference。 (我不太确定是否ListPreference因为更换是正确的方法。无论如何它都有效)
  3. 手动显示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 及更高版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 AppCompatPreferenceActivity 将工具栏添加到 PreferenceActivity 会导致重叠 的相关文章

随机推荐