2013年10月7日月曜日

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

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

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

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

1から作成する場合

まずは設定項目を作成するために、PreferenceManagerを取得する。
  1. // For Activity  
  2. PreferenceManager PreferenceActivity::getPreferenceManager()  
  3.   
  4. // For Fragment  
  5. PreferenceManager PreferenceFragment::getPreferenceManager()  
PreferenceManagerで設定項目のルート項目を作成する。
  1. PreferenceScreen PreferenceManager::createPreferenceScreen(Context context);  
以降は、設定項目を作成して追加して行く。
  1. // Context context;  
  2. PreferenceScreen root = getPreferenceManager().createPreferenceScreen(context);  
  3. PreferenceCategory category = new PreferenceCategory(context);  
  4. category.setTitle("Category");  
  5. root.addPreference(category);  
  6.   
  7. PreferenceScreen item = getPreferenceManager().createPreferenceScreen(context);  
  8. item.setTitle("Item");  
  9. category.add(item);  
最後に、設定画面に設定する。
  1. // For Activity  
  2. // void PreferenceScreen::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  3. //   
  4. // For Fragment  
  5. // void PreferenceFragment::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  6. //  
  7. setPreferenceScreen(root);  

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

既存の設定項目のルート項目を取得する。
  1. // For Activity  
  2. PreferenceScreen PreferenceActivity::getPreferenceScreen()  
  3.   
  4. // For Fragment  
  5. PreferenceScreen PreferenceFragment::getPreferenceScreen()  
取得したルート項目にさきほどと同様に追加していく。


参考までに

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

  1. public class RpNoteVersionFragment extends PreferenceListFragment {  
  2.  @Override  
  3.  public void onCreate(Bundle savedInstanceState) {  
  4.   super.onCreate(savedInstanceState);  
  5.   setPreferenceScreen(createReleaseNote());  
  6.  }  
  7.  public PreferenceScreen createReleaseNote() {  
  8.   final Context c = getActivity();  
  9.   PreferenceScreen root = getPreferenceManager().createPreferenceScreen(c);  
  10.     
  11.   BufferedReader reader = null;  
  12.   InputStream stream = null;  
  13.   String buffer = null;  
  14.   PreferenceCategory category = null;  
  15.   try {  
  16.    stream = c.getResources().openRawResource(R.raw.release_note);  
  17.    reader = new BufferedReader(new InputStreamReader(stream));  
  18.    while ((buffer = reader.readLine()) != null) {  
  19.     if (category == null) {  
  20.      category = new PreferenceCategory(c);  
  21.      category.setTitle(buffer);  
  22.      root.addPreference(category);  
  23.     } else if (buffer.equals("")) {  
  24.      category = null;  
  25.     } else {  
  26.      Preference item = new Preference(c);  
  27.      item.setTitle(buffer);  
  28.      item.setLayoutResource(R.layout.pref_single_item);  
  29.      category.addPreference(item);  
  30.     }  
  31.    }  
  32.   } catch (IOException ioe) {  
  33.      
  34.   } finally {  
  35.    if (reader != null) {  
  36.     try {  
  37.      reader.close();  
  38.     } catch (IOException ioe) {}  
  39.    }  
  40.    if (stream != null) {  
  41.     try {  
  42.      stream.close();  
  43.     } catch (IOException ioe2) {}  
  44.    }  
  45.   }  
  46.   return root;  
  47.  }  
  48. }  
  49.   
  50. // R.raw.release_noteの中身  
  51. Ver.0.3.0  
  52. Append text to an existing note with share.  
  53. Add icons of category.  
  54.   
  55. Ver.0.2.0  
  56. Change an order of category display.  
  57.   
  58. Ver.0.1.1  
  59. Display a widget, today's number of schedules.   
  60.   
  61. Ver.0.0.0  
  62. First version   

0 件のコメント:

コメントを投稿