2012-05-21 18 views
8

¿Está el SwitchPreference introducido en ICS compatible en la biblioteca android-support-v4? Estoy tratando de actualizar algunos proyectos antiguos y me gustaría usar SwitchPreferences si es posible.Compatibilidad con SwitchPreference (pre ICS)?

Sé que puedo hacer un archivo de recursos por separado para distinguir la versión de la API, pero me gustaría evitar eso si es posible.

+0

La respuesta corta es no, actualmente el 'SwitchPreference' no está disponible en la biblioteca de soporte. Sin embargo, no debería ser demasiado complicado respaldarlo, si alguien aún no lo ha hecho. –

Respuesta

8

¿Se ha introducido SwitchPreference en ICS compatible en la biblioteca android-support-v4?

No, lo siento.

Sin embargo, no debería ser demasiado complicado para respaldarlo, si alguien aún no lo ha hecho.

En realidad, puede ser un poco de dolor, ya que también requiere un backport del interruptor, y backporting widgets es a veces problemático, ya que con frecuencia utilizan métodos de paquetes-privada que backports no pueden tener acceso.

Sé que puedo hacer un archivo de recursos por separado para distinguir la versión de la API, pero me gustaría evitar eso si es posible.

Bueno, eso sería ciertamente manera más sencilla que las alternativas:

  • la mencionada backport

  • crear algún tipo de alias Preference mecanismo que le permite utilizar SwitchPreference en los dispositivos más nuevos y CheckBoxPreference en dispositivos más antiguos con solo un archivo de recursos

+0

Eso es lo que sospechaba. ¡Gracias! –

+0

@CommonsWare ¿Por qué no simplemente crear su Switch personalizado en el mismo paquete, entonces? –

+0

@ChristopherPerry: No tengo idea de a qué se refiere, lo siento. – CommonsWare

5

android-switch-backport tiene SwitchPreference que funciona en Android 2.1+.

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

+0

Lo único que no me gusta de estos, es que no se pueden agrupar e incluir en la aplicación como jar, etc. En su lugar, debe colocar muchos (81) archivos res en su aplicación, lo que ahoga sus propios recursos. Es una pena que la lib de android-support no la incluya. – Doomsknight

+0

Las instrucciones y asistencia son mucho mejores con esta: https://github.com/ankri/SwitchCompatLibrary – LoungeKatt

+0

@TwistedUmbrella SwitchCompatLibrary no proporciona SwitchPreference, por lo que no ayuda con esta pregunta. – Intrications

0

He intentado todas las soluciones que he encontrado, pero no de ellos eran aptos mis necesidades, así que creé mi propio widget de wich se utiliza ObjectAnimator de nineOld lib compatibilidad y funciona bastante bien en cualquier API androide.

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

}

En 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" 
    /> 

En la Actividad/fragmento es suficiente con findViewById y establecer clickListener a ella, y en onClick devolución de llamada manejarlo:

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

Pruebe esta solución, si desea crear actividades de configuración mediante programación.

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