8

ICS で導入されたはSwitchPreference、android-support-v4 ライブラリで互換性がありますか? いくつかの古いプロジェクトを更新しようとしていますが、可能であれば SwitchPreferences を使用したいと考えています。

API のバージョンを区別するために別のリソース ファイルを作成できることはわかっていますが、可能であればそれは避けたいと考えています。

4

4 に答える 4

8

ICS で導入された SwitchPreference は、android-support-v4 ライブラリと互換性がありますか?

いいえ、申し訳ありません。

ただし、誰かがまだバックポートしていない場合、バックポートするのはそれほど難しいことではありません。

実際には、Switch のバックポートも必要になるため、少し面倒かもしれません。ウィジェットのバックポートは、バックポートがアクセスできないパッケージ プライベート メソッドを頻繁に使用するため、面倒な場合があります。

API のバージョンを区別するために別のリソース ファイルを作成できることはわかっていますが、可能であればそれは避けたいと考えています。

まあ、それは確かに代替案よりもはるかに簡単です:

  • 前述のバックポート

  • リソース ファイルが 1 つしかない新しいデバイスと古いデバイスでPreference使用できる、ある種のエイリアス メカニズムを作成するSwitchPreferenceCheckBoxPreference

于 2012-05-21T23:32:19.397 に答える
5

android-switch-backport には、Android 2.1 以降で動作する SwitchPreference があります。

https://github.com/BoD/android-switch-backport

于 2012-10-24T16:01:27.553 に答える
0

私は見つけたすべてのソリューションを試しましたが、どれも私のニーズに合わなかったので、nineOld 互換性ライブラリの ObjectAnimator を使用する独自のウィジェットを作成し、どの Android API でもうまく動作します。

import android.widget.RelativeLayout;
import com.myapp.utilities.AppUtils;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;
import com.nineoldandroids.animation.ObjectAnimator;

public class SwitchButton extends RelativeLayout {

public static final int TEXT_SIZE = 11;

public float HANDLE_SHIFT = -40f;
public float TEXT_RIGHT_SHIFT = 40f;
public static int BUTTON_ID = 0x00009999;
public static int TEXT_ID = 0x00008888;


private Button handleButton;
private RoboTextView textView;
private boolean switchEnabled;
private String yesStr;
private String noStr;
private int TEXT_LEFT_PADDING = 13;

private ObjectAnimator animateHandleLeftShift;
private ObjectAnimator animateHandleRightShift;
private int HANDLE_BUTTON_HEIGHT = 22;
private int HANDLE_BUTTON_WIDTH = 42;
private ObjectAnimator animateTextLeftShift;
private ObjectAnimator animateTextRightShift;


public SwitchButton(Context context) {
    super(context);
    onCreate(context);
}


private void onCreate(Context context) {

    float density = context.getResources().getDisplayMetrics().density;

    TEXT_LEFT_PADDING *= density;

    HANDLE_BUTTON_HEIGHT *= density;
    HANDLE_BUTTON_WIDTH *= density;

    HANDLE_SHIFT *= density;
    TEXT_RIGHT_SHIFT *= density;

    yesStr = getContext().getString(R.string.yes).toUpperCase();
    noStr = getContext().getString(R.string.no).toUpperCase();

    {// Button
        handleButton = new Button(getContext());
        RelativeLayout.LayoutParams buttonParams = new LayoutParams(HANDLE_BUTTON_WIDTH, HANDLE_BUTTON_HEIGHT);
        buttonParams.addRule(RelativeLayout.CENTER_VERTICAL);
        buttonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

        handleButton.setBackgroundResource(R.drawable.button_switch_handle_selector);
        handleButton.setId(BUTTON_ID);

        addView(handleButton, buttonParams);
    }


    {// Text
        textView = new RoboTextView(getContext());
        LayoutParams textParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        textParams.addRule(RelativeLayout.CENTER_VERTICAL);

        textView.setText(yesStr);
        textView.setTextColor(getContext().getResources().getColor(R.color.new_normal_gray));
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, TEXT_SIZE);
        textView.setPadding(TEXT_LEFT_PADDING, 0, 0, 0);
        textView.setFont(RoboTextView.ROBOTO_BOLD_FONT);
        textView.setId(TEXT_ID);
        float shadowRadius = 0.5f ;
        float shadowDx = 0;
        float shadowDy = 1;
        textView.setShadowLayer(shadowRadius, shadowDx, shadowDy, Color.BLACK);

        addView(textView, textParams);
    }
    initFlipAnimation();

}

@Override
public void setOnClickListener(OnClickListener l) {
    handleButton.setOnClickListener(l);
    textView.setOnClickListener(l);
}

public void toggle(View view){
    if (AppUtils.HONEYCOMB_PLUS_API && view.getId() == TEXT_ID) { // ignore text clicks
        return;
    }

    switchEnabled = !switchEnabled;

    if (switchEnabled) {
        // animate handle to the left
        animateHandleLeftShift.start();
        animateTextLeftShift.start();

        textView.setText(noStr);
    } else {
        animateHandleRightShift.start();
        animateTextRightShift.start();

        textView.setText(yesStr);
    }
}

private android.view.animation.Interpolator accelerator = new LinearInterpolator();
private static final int DURATION = 70;

private void initFlipAnimation() {


    animateHandleLeftShift = ObjectAnimator.ofFloat(handleButton, "translationX", 0f, HANDLE_SHIFT);
    animateHandleLeftShift.setDuration(DURATION);
    animateHandleLeftShift.setInterpolator(accelerator);

    animateHandleRightShift = ObjectAnimator.ofFloat(handleButton, "translationX", HANDLE_SHIFT, 0f);
    animateHandleRightShift.setDuration(DURATION);
    animateHandleRightShift.setInterpolator(accelerator);

    animateHandleLeftShift.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator anim) {
            // TODO
        }
    });


    animateTextLeftShift = ObjectAnimator.ofFloat(textView, "translationX", 0f, TEXT_RIGHT_SHIFT);
    animateTextLeftShift.setDuration(DURATION);
    animateTextLeftShift.setInterpolator(accelerator);

    animateTextRightShift = ObjectAnimator.ofFloat(textView, "translationX", TEXT_RIGHT_SHIFT, 0f);
    animateTextRightShift.setDuration(DURATION);
    animateTextRightShift.setInterpolator(accelerator);
}

}

XML で

<com.chess.SwitchButton
    android:id="@+id/ratedGameSwitch"
    android:layout_width="@dimen/button_switch_width"
    android:layout_height="@dimen/button_switch_height"
    android:background="@drawable/button_switch_back"
    />

アクティビティ/フラグメントでは、findViewById とそれに clickListener を設定するだけで済み、onClick コールバックでそれを処理します。

switchButton = (SwitchButton) optionsView.findViewById(R.id.ratedGameSwitch);
switchButton.setOnClickListener(this);


@Override
public void onClick(View view) {
    if (view.getId() == SwitchButton.BUTTON_ID  || view.getId() == SwitchButton.TEXT_ID){
        switchButton.toggle(view);
    }
}
于 2013-01-22T02:51:06.417 に答える
0

Try this solution, if you want to create settings activity programmatically.

public class SettingsActivity extends PreferenceActivity {

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PreferenceScreen rootScreen = getPreferenceManager()
                .createPreferenceScreen(this);
        setPreferenceScreen(rootScreen);
        Preference NotifCheck=null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            NotifCheck = new SwitchPreference(this);

        } else {
            NotifCheck = new CheckBoxPreference(this);

        }
        NotifCheck.setKey("yourKey");
        NotifCheck.setTitle(R.string.ShowNotification);
        NotifCheck.setEnabled(true);
        rootScreen.addPreference(NotifCheck);
    }
}
于 2014-03-15T19:36:24.387 に答える