web-dev-qa-db-fra.com

Android: Utilisation de la préférence pré API niveau 14

Pré-API niveau 14, il n'y a pas de préférence de commutateur. Si j'utilise preferences.xml pour créer mon écran de préférences, existe-t-il un moyen de distinguer les niveaux d'API? Vous avez donc une case à cocher pour les anciennes versions et un commutateur pour l'API 14?

Quel serait le meilleur moyen?

25
AndyAndroid

Si j'utilise preferences.xml pour créer mon écran de préférences, existe-t-il un moyen de distinguer les niveaux d'API? Vous avez donc une case à cocher pour les anciennes versions et un commutateur pour l'API 14?

Créez un répertoire res/xml-v14/ contenant un preferences.xml avec votre SwitchPreference. Créez un répertoire res/xml/ qui contient un fichier preferences.xml qui remplace la SwitchPreference par une CheckBoxPreference. Android chargera la bonne édition de fichier preferences.xml en fonction de la version de l'appareil sur laquelle l'application est exécutée.

47
CommonsWare

Vous pouvez également utiliser la bibliothèque Android-switch-backport qui possède un SwitchPreference qui fonctionne sur Android 2.1+.

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

17
Intrications

Il existe une solution de contournement dont je ne suis pas sûr du volume, en indiquant quelle vue utiliser dans CheckBoxPreference (certaines fonctions risquent d'être omises, mais en général, cela fonctionne).

La solution de contournement utilisera CheckBoxPreference pour pré-API-14 et SwitchPreference pour API 14 et versions ultérieures.

Voici le code:

public class SwitchPreference extends CheckBoxPreference
  {
  Android.preference.SwitchPreference _switchPreference =null;

  public SwitchPreference(final Context context)
    {
    super(context);
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH)
      _switchPreference=new Android.preference.SwitchPreference(context);
    }

  public SwitchPreference(final Context context,final AttributeSet attrs)
    {
    super(context,attrs);
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH)
      _switchPreference=new Android.preference.SwitchPreference(context,attrs);
    }

  public SwitchPreference(final Context context,final AttributeSet attrs,final int defStyle)
    {
    super(context,attrs,defStyle);
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH)
      _switchPreference=new Android.preference.SwitchPreference(context,attrs,defStyle);
    }

  @Override
  protected View onCreateView(final ViewGroup parent)
    {
    final View view;
    if(VERSION.SDK_INT>=VERSION_CODES.ICE_CREAM_SANDWICH)
      {
      view=_switchPreference.getView(null,parent);
      // set as checked the view and the view's children, each in case it extend from Checkable
      ViewUtil.setChecked(view,isChecked());
      // set as non-clickable the view and the view's children
      ViewUtil.setClickable(view,false);
      }
    else view=super.onCreateView(parent);
    return view;
    }
2

vous pouvez utiliser SwitchCompat:

<Android.support.v7.widget.SwitchCompat
    Android:id="@+id/switch_compat"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentRight="true"
    Android:checked="true"
    Android:textOff="OFF"
    Android:textOn="ON"
    app:showText="false"
    Android:focusable="false"
    Android:focusableInTouchMode="false"/>

sur setOnCheckedChangeListener:

SwitchCompat switchCompat = (SwitchCompat)convertView.findViewById(R.id.switch_compat);
        switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    textView.setText("check");
                } else {
                    textView.setText("unCheck");
                }
            }
        });

j'espère vous aider.

1
tvtruong

Essayez ce code:

public class SettingsActivity extends PreferenceActivity {

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_settings);
        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("ShowNotification");
        NotifCheck.setTitle(R.string.ShowNotification);
        NotifCheck.setEnabled(true);
        rootScreen.addPreference(NotifCheck);
        // Show the Up button in the action bar.
        setupActionBar();
    }
}
0
Vladislav