2010-09-13

Präferenzen mit Häkchen – DialogPreference leichtgemacht

Unter Android ist es extrem einfach, Anwendungseinstellungen zu verwalten. Für die Benutzeroberfläche stehen eine Reihe von Komponenten zur Verfügung, beispielsweise CheckBoxPreference (Häkchen ist gesetzt/nicht gesetzt) und ListPreference (aus einer Liste wird genau ein Element ausgewählt). Eine Kombination aus beiden (also eine Liste mit Checkboxen) ist im Standard nicht vorhanden, kann aber mit sehr wenigen Zeilen Code realisiert werden:

/**
 * PickCountriesPreference.java
 *
 * TKWeek (c) Thomas Künneth 2010
 * Alle Rechte beim Autoren. All rights reserved.
 */
package com.thomaskuenneth.android.util;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Locale;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.ScrollView;

public class PickCountriesPreference extends DialogPreference {

  private static final String TAG = PickCountriesPreference.class
      .getSimpleName();

  private SharedPreferences prefs;
  private Hashtable<String, CheckBox> ht;

  public PickCountriesPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    ht = new Hashtable<String, CheckBox>();
  }

  public static boolean isSelected(Context context, Locale l) {
    SharedPreferences prefs = context.getSharedPreferences(TAG,
        Context.MODE_PRIVATE);
    return prefs.getBoolean(l.getCountry(), true);
  }

  @Override
  protected View onCreateDialogView() {
    Context context = getContext();
    prefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
    ScrollView v = new ScrollView(context);
    LinearLayout layout = new LinearLayout(context);
    layout.setOrientation(LinearLayout.VERTICAL);
    v.addView(layout);
    layout.addView(getCheckbox(context, Locale.GERMANY));
    layout.addView(getCheckbox(context, Locale.US));
    return v;
  }

  private View getCheckbox(Context context, Locale l) {
    CheckBox cb = new CheckBox(context);
    String country = l.getCountry();
    ht.put(country, cb);
    cb.setText(l.getDisplayCountry());
    cb.setChecked(prefs.getBoolean(country, true));
    return cb;
  }

  @Override
  protected void onDialogClosed(boolean positiveResult) {
    if (positiveResult) {
      Editor editor = prefs.edit();
      Enumeration<String> e = ht.keys();
      while (e.hasMoreElements()) {
        String country = e.nextElement();
        editor.putBoolean(country, ht.get(country).isChecked());
      }
      editor.commit();
    }
  }
}
Java2html

Android stellt hierfür die Klasse DialogPreference zur Verfügung, die abstrakt ist, also nicht direkt verwendet werden kann. Deshalb leitet meine Klasse PickCountriesPreference von ihr ab und implementiert die Methode onCreateDialogView. Sie liefert eine View, die den Inhaltsbereich des anzuzeigenden Dialogs repräsentiert. In meinem Fall ist das eine ScrollView, die wiederum ein LinearLayout enthält. Hierin sind CheckBoxes enthalten. Die einzige Aufgabe, die noch zu tun ist: das Setzen der Werte in den SharedPreferences. Wie das gemacht wird, finden Sie in der Methode onDialogClosed.

Der hier gezeigte Quelltext ist – Sie sehen das sicher – an die Bedürfnisse von TKWeek angepasst. Er lässt sich aber leicht verallgemeinern.

No comments:

Post a Comment