2016-01-10 1 views
1

Каков наилучший способ создания ListPreference для использования в качестве «подборщика размера шрифта»? Font size pickerAndroid: ListPreference в качестве выбора размера шрифта или доступа к отдельным представлениям элементов ListView

Есть ли способ получить доступ к отдельным представлениям элементов ListView в этом предпочтении и установить их размер шрифта? Или мне нужно создать пользовательский ListPreference с пользовательским адаптером?

Заранее спасибо.

ответ

3

Решено. Мне нужно было создать обычай ListPreference. Я не мог найти способ доступа к ListView Диалога. Область заголовка остается неизменной, изменена только область содержимого диалогового окна. В onPrepareDialogBuilder(builder) Мне пришлось создать пользовательский адаптер для ListView, где я могу установить разные размеры шрифта.

public class FontSizeListPreference extends ListPreference { 

    private int mClickedDialogEntryIndex; 

    public FontSizeListPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public FontSizeListPreference(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 
     if(getEntries() == null || getEntryValues() == null){ 
      super.onPrepareDialogBuilder(builder); 
      return; 
     } 

     ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), R.layout.preference_font_size_checked_tv, getEntries()) { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       float fontSizePx; 
       CheckedTextView view = (CheckedTextView) convertView; 
       if(view == null){ 
        view = (CheckedTextView) View.inflate(getContext(), R.layout.preference_font_size_checked_tv, null); 
       } 
       switch (position){ 
        case 0: 
         fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_small_medium); 
         break; 
        case 2: 
         fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_large_medium); 
         break; 
        case 1:default: 
         fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_medium_medium); 
       } 
       view.setText(getEntries()[position]); 
       view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSizePx); 
       return view; 
      } 
     }; 

     mClickedDialogEntryIndex = findIndexOfValue(getValue()); 
     builder.setSingleChoiceItems(adapter, mClickedDialogEntryIndex, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       mClickedDialogEntryIndex = which; 
       FontSizeListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); 
       dialog.dismiss(); 
      } 
     }); 
     builder.setPositiveButton(null, null); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     super.onDialogClosed(positiveResult); 

     if(positiveResult && mClickedDialogEntryIndex >= 0 && getEntryValues() != null){ 
      String val = getEntryValues()[mClickedDialogEntryIndex].toString(); 
      if(callChangeListener(val)){ 
       setValue(val); 
      } 
     } 
    } 
} 

И компоновка элемента определяется в /res/layout/preference_font_size_checked_tv.xml:

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeightSmall" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:checkMark="@null" 
    android:drawableLeft="?android:attr/listChoiceIndicatorSingle" 
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" 
    android:paddingRight="?android:attr/listPreferredItemPaddingRight" 
    android:height="48dp"/> 

Я также хотел индикатор находиться на левой стороне. Вот почему checkMark имеет значение null и drawableLeft для выбора отдельного индикатора выбора списка.

0

Лучший способ (без нарушения любого из первоначальной реализации ListPreference):

@Override 
protected void onPrepareDialogBuilder(Builder builder) {    

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), R.layout.preference_font_size_checked_tv, getEntries()) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      float fontSizePx; 
      CheckedTextView view = (CheckedTextView) convertView; 
      if(view == null){ 
       view = (CheckedTextView) View.inflate(getContext(), R.layout.preference_font_size_checked_tv, null); 
      } 
      switch (position){ 
       case 0: 
        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_small_medium); 
        break; 
       case 2: 
        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_large_medium); 
        break; 
       case 1:default: 
        fontSizePx = getContext().getResources().getDimension(R.dimen.font_size_medium_medium); 
      } 
      view.setText(getEntries()[position]); 
      view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSizePx); 
      return view; 
     } 
    }; 
    builder.setAdapter(adapter, this); 
    super.onPrepareDialogBuilder(builder); 
} 

@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    preference.setSummary(getEntry()); 
    return true; 
} 

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

  • Нет связанных вопросов^_^