2012-02-29 3 views
25

Pre-API Level 14 нет предпочтений переключателя. Если я использую preferences.xml для создания экрана настроек, есть ли способ различать уровни API? Итак, имея флажок для старых версий и коммутатор для API 14?Android: использование Pre Pre API уровня 14

Что было бы лучшим способом?

ответ

47

Если я использую preferences.xml для создания экрана настроек, есть ли способ различать уровни API? Итак, имея флажок для старых версий и коммутатор для API 14?

Создать res/xml-v14/ каталог, который содержит preferences.xml, который имеет свой SwitchPreference. Создайте каталог res/xml/, содержащий файл preferences.xml, который заменяет SwitchPreference на CheckBoxPreference. Android загрузит правую версию файла preferences.xml на основе версии устройства, на котором работает приложение.

+1

Есть ли эквивалент тега «include» файлов lauout, но для файлов настроек? Таким образом, потребуется только минимальный текст, поскольку дельта будет расположена в папке v14, верно? –

+0

@androiddeveloper: Извините, не то, что я знаю. – CommonsWare

+0

Я сделал хороший обход этой проблемы, которая, когда это возможно, обертывает switchPreference, и используйте этот флажок, если это невозможно. Не могли бы вы проверить это и посмотреть, похоже ли это нормально? согласно моим тестам, он работает отлично, но, возможно, я пропустил некоторые функции. –

17

Вы также можете использовать библиотеку Android-переключателей-backport, которая имеет SwitchPreference, которая работает на Android 2.1+.

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

+0

Когда я добавляю зависимость к 'gradle', мой проект застревает в' компиляции зависимостей'. – theblang

2

Существует обходной путь, который я не уверен, насколько полно она, по упаковке, какой вид использовать в CheckBoxPreference (может пропустить некоторые функции, но в общем использовании, она работает).

Обходной путь будет использовать CheckBoxPreference для pre-API-14 и SwitchPreference для API 14 и выше.

Вот код:

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

@ 3c71 извините, но вы ошибаетесь, и я думаю, вы не пробовали. это нормально объявлять любой тип класса, даже если у вас нет доступа к нему из-за разных API. вы получите сбои только в том случае, если вы используете методы (включая CTOR) класса, так как у вас нет доступа к ним. –

+0

На самом деле это умное и рабочее решение. Убедитесь, что функция SwitchPreference находится только в вашем собственном пакете, а также XML не использует оригинальный SwitchP, а новый. Кроме того, вам может потребоваться переопределить некоторые другие методы, например. isChecked и т. д. Другими словами, элемент работает как CheckBoxPreference, но выглядит как SwitchPreference. – digitalfootmark

+0

@digitalfootmark Я не уверен. До сих пор это работало отлично для меня. Вот почему я написал, что это не «полно», так как я не уверен, какие функции следует добавлять. Вы уверены, что «isChecked» не работает? Я имею в виду, я даже использую его в этом коде ... –

0

Попробуйте этот код:

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

вы можете использовать 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"/> 

на 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"); 
       } 
      } 
     }); 

Я надеюсь вам помочь.

Смежные вопросы