SwitchPreference(pre ICS)兼容性?

ICS中的SwitchPreference是否在android-support-v4库中兼容? 我试图更新一些旧的项目,并希望如果可能的话使用SwitchPreferences。

我知道我可以创build一个单独的资源文件来区分API版本,但是我想尽可能避免这种情况。

Solutions Collecting From Web of "SwitchPreference(pre ICS)兼容性?"

ICS中的SwitchPreference是否在android-support-v4库中兼容?

不,对不起。

但是,如果还没有人支持它,那么它不应该太棘手。

实际上,这可能有点痛苦,因为它也需要一个Switch的backport,并且backporting widgets有时很麻烦,因为它们经常使用backports无法访问的package-private方法。

我知道我可以创build一个单独的资源文件来区分API版本,但是我想尽可能避免这种情况。

那么,这肯定比替代scheme更简单:

  • 上述的backport

  • 创build一些别名Preference机制,允许您在较新的设备上使用SwitchPreference ,而在较旧的设备上使用CheckBoxPreference只使用一个资源文件

android-switch-backport有一个适用于Android 2.1+的SwitchPreference。

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

我已经尝试了我发现的每个解决scheme,但是其中没有一个适合我的需求,所以我创build了自己的小部件,这是从九Old兼容性库使用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,并在onClickcallback处理它:

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

如果要以编程方式创build设置活动,请尝试此解决scheme。

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