14

AppCompat v21 が提供する SwitchCompat は、SwitchCompatPreference を提供しないようです。

SwitchPreference を使用できることはわかっていますが、視覚的には同じではありません。Android 4.x の場合。アクティビティ インターフェイスで v21 の SwitchCompact を使用すると、マテリアル スイッチ ボタンのように見えますが、SwitchCompactPreference がないため、設定ビューで SwitchPreference を使用する必要があり、明らかに Android 4.0 の外観になっています。

AppCompact v21 半分完成したようです。

何か不足していますか?

4

7 に答える 7

10

現在受け入れられている回答と cgollner の要点に基づいて、そこから xml レイアウトのみを取得する場合: https://gist.github.com/cgollner/3c7fe2f9d34aee38bd0c

そしてこれを行います:

<CheckBoxPreference
            android:widgetLayout="@layout/preference_switch_layout"
            android:defaultValue="off"
            android:key="key1"
            android:title="@string/title1" />

これの代わりに (setWidgetLayoutResource でソースからレイアウトを追加する):

<com.cgollner.unclouded.preferences.SwitchCompatPreference
            android:defaultValue="off"
            android:key="key1"
            android:title="@string/title1" />

そうすれば、同じ xml を使用して、ロリポップとそれ以下の両方でアニメーションも機能します。

于 2015-07-05T11:36:01.827 に答える
6

これは、古いバージョンでもマテリアル スイッチを表示するコード スニペットです。 https://gist.github.com/cgollner/5b31123c98b2c1cad8dc https://gist.github.com/cgollner/3c7fe2f9d34aee38bd0c

参考:https ://plus.google.com/118168530059850940658/posts/badausxo1J6

于 2015-02-25T15:37:02.290 に答える
1

これは、受け入れられた回答の SwitchCompat ウィジェットのアニメーションに関するものです。

Android 4.0-4.3 ではフラグは mHasSpecifiedLayout、Android 4.4 ではフラグは mCanRecycleLayout です。

setWidgetLayoutResource を使用してウィジェットを設定すると、このフラグが変更されます。

別のパッケージ名 (android.preference または com.android を除く) を使用して新しいカスタマイズされた設定クラスを作成すると、このフラグも変更されます。

mHasSpecifiedLayout が false または CanRecycleLayout が true の場合、アニメーションは機能します。それ以外の場合、アニメーションは機能しません。

したがって、setWidgetLayoutResource() メソッドの代わりにリフレクションを使用してウィジェット レイアウトを設定すると、アニメーションが壊れることはありません。

ここにスニペットがあります:

        CheckBoxPreference switchPref = new CheckBoxPreference(getActivity());
        try {
            Field field = Preference.class.getDeclaredField("mWidgetLayoutResId");
            field.setAccessible(true);
            field.setInt(switchPref, R.layout.preference_switch_layout);
        } catch (Exception e) {
            switchPref.setWidgetLayoutResource(R.layout.preference_switch_layout);
        }
        switchPref.setKey(key);
        switchPref.setTitle(titleRes);
        switchPref.setSummary(summaryRes);
        switchPref.setDefaultValue(defaultValue);
于 2015-10-04T09:28:00.940 に答える
1

短所: すべてのデバイスで機能するとは限りません。


AppCompatDelegateあなたの中で使用しPreferenceActivity(からクラスを基にすることができAppCompatPreferenceActivityます)、 onCreateView をオーバーライドして、ビューSwitchCompatの作成中に返されますSwitch

つまり、

public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
    private AppCompatDelegate mDelegate;

    //... other methods omitted for clarity

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        // Allow super to try and create a view first
        final View result = super.onCreateView(name, context, attrs);
        if (result != null) {
            return result;
        }

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            switch (name) {
                // ... can add other views here
                case "Switch":
                    return new SwitchCompat(this, attrs);
            }
        }
        return null;
    }
}

利点は、この方法で、レイアウトを変更せずに既存のアプリのサポートを追加できることと、最小限の労力です。

于 2015-07-22T11:55:51.893 に答える