2013年10月7日月曜日

[Android SDK] 動的に設定画面(Preference)を作成する

ほとんどのAndroidアプリには設定画面が用意されている。

(例:メモガキの設定画面)

こういった設定画面は、.xmlファイルに記述するケースが多いが動的にプログラミングで作成することもできる。
例えば、デバッグ時、AndroidOSのバージョンに応じて表示する設定項目の場合に使える。

1から作成する場合

まずは設定項目を作成するために、PreferenceManagerを取得する。
// For Activity
PreferenceManager PreferenceActivity::getPreferenceManager()

// For Fragment
PreferenceManager PreferenceFragment::getPreferenceManager()
PreferenceManagerで設定項目のルート項目を作成する。
PreferenceScreen PreferenceManager::createPreferenceScreen(Context context);
以降は、設定項目を作成して追加して行く。
// Context context;
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(context);
PreferenceCategory category = new PreferenceCategory(context);
category.setTitle("Category");
root.addPreference(category);

PreferenceScreen item = getPreferenceManager().createPreferenceScreen(context);
item.setTitle("Item");
category.add(item);
最後に、設定画面に設定する。
// For Activity
// void PreferenceScreen::setPreferenceScreen(PreferenceScreen preferenceScreen)
// 
// For Fragment
// void PreferenceFragment::setPreferenceScreen(PreferenceScreen preferenceScreen)
//
setPreferenceScreen(root);

既存の設定画面に追加する場合

既存の設定項目のルート項目を取得する。
// For Activity
PreferenceScreen PreferenceActivity::getPreferenceScreen()

// For Fragment
PreferenceScreen PreferenceFragment::getPreferenceScreen()
取得したルート項目にさきほどと同様に追加していく。


参考までに

メモガキではアプリの更新履歴を、ファイル(res/raw)から更新履歴を情報を読み込み、動的に設定画面をベースに表示している。

public class RpNoteVersionFragment extends PreferenceListFragment {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setPreferenceScreen(createReleaseNote());
 }
 public PreferenceScreen createReleaseNote() {
  final Context c = getActivity();
  PreferenceScreen root = getPreferenceManager().createPreferenceScreen(c);
  
  BufferedReader reader = null;
  InputStream stream = null;
  String buffer = null;
  PreferenceCategory category = null;
  try {
   stream = c.getResources().openRawResource(R.raw.release_note);
   reader = new BufferedReader(new InputStreamReader(stream));
   while ((buffer = reader.readLine()) != null) {
    if (category == null) {
     category = new PreferenceCategory(c);
     category.setTitle(buffer);
     root.addPreference(category);
    } else if (buffer.equals("")) {
     category = null;
    } else {
     Preference item = new Preference(c);
     item.setTitle(buffer);
     item.setLayoutResource(R.layout.pref_single_item);
     category.addPreference(item);
    }
   }
  } catch (IOException ioe) {
   
  } finally {
   if (reader != null) {
    try {
     reader.close();
    } catch (IOException ioe) {}
   }
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException ioe2) {}
   }
  }
  return root;
 }
}

// R.raw.release_noteの中身
Ver.0.3.0
Append text to an existing note with share.
Add icons of category.

Ver.0.2.0
Change an order of category display.

Ver.0.1.1
Display a widget, today's number of schedules. 

Ver.0.0.0
First version 

0 件のコメント:

コメントを投稿