徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【Androidにおけるメニュー画面およびプリファレンス(設定項目)の作成】
Androidに備わっているクラスを利用して、メニュー画面を簡単に作れるようになっている。

メニューについてはAndroidの仕様変更が結構あり、ちょっと前の参考書で対応できない部分になかなか手間取った。
まず、ハードとしてのmenuボタンの廃止により、基本的にはアクションバー右上にメニューが表示されるようになった。
また3.0でFragmentという、アクティビティを複数の部分で作成する機能が実装されたことにより、
Android(3.0)より前と、3.0以後によってメニューの実装方法が異なることに注意。

共通する部分
・メニュー項目の作成
・呼び出し元アクティビティ内の記述
・プリファレンスのレイアウト(正確にはレイアウト元)xmlファイル


・メニュー項目の作成
layout/menuにmenu.xml(ファイル名任意)ファイルをつくる


<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/settings"
android:title="@string/settings_label"
android:orderInCategory="10"
android:showAsAction="always" />
</menu>


1.id:メニュー項目を一意に判別するために付与する。
2.title:メニュー項目に表示する文字。
3.orderInCategory:メニューアイテムの重み付け。複数のメニューアイテムがあるとき数値が大きい方が先に表示される、
4.showAsAction:3.0以降でアクションバーにメニューアイテムをどのように表示するか、しないか。
それより前のverではこの属性に関係なく、単純に、Menuボタンを押すとメニュー項目が出てくる(と思う。。)

これでメニューが作られた。


・呼び出し元アクティビティ内の記述

import android.view.Menu;
import android MenuItem;

public class Main extends Activity{
・・・・・
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity_sudoku, menu);
return true;
}
}



1.getMenuInflater()
XMLからメニュー定義を読み出し、実際のビューに変換するために使うMenuInflaterのインスタンスを返す。
inflaterは複数のレイアウトXMLファイルをレイアウトに使用する際に使うものということらしい。

2.MenuInflater.inflate()
実際にインフレートする。
void inflate(int menuRes, Menu menu)
Inflate a menu hierarchy from the specified XML resource.


メニュー項目を選択すると、anOptionsItemSelected()が呼び出される。
この関数もオーバーライドして、動作を決める。


public class Main extends Activity{
・・・・・
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.settings:
startActivity(new Intent(this, Prefs.class));
return true;
}
return false;
}

}

onOptionsItemSelected()では、タッチされたメニュー項目のidをswitch文で判別し、動作を振り分けるのが一般的のようだ。
ここでは通常のメニュー項目として考えられるプリファレンス(設定項目)へ飛ぶとする。

・プリファレンス(設定項目)のレイアウト(正確にはレイアウト元)xmlファイル
プリファレンスはres/xmlにsettings(ファイル名任意).xmlとして書き込む。


<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreference
android:key="key1"
android:title="@string/key1_title"
android:summary="@string/key1_summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="key2"
android:title="@string/key2_title"
android:summary="@string/key2_summary"
android:defaultValue="true" />
</PreferenceScreen>


プリファレンスは<PreferenceScreen>~</PreferenceScreen>内に書く。
PreferenceCategoryを使えば、Categoryとしてまとめることもできる。

1.key:参照する際のキーとなる。
2.title:プリファレンスの項目名
3.summary:プリファレンスの説明文(項目名の下にやや小さな文字で書かれる概要)
4.defaultValue:デフォルト値を(ここではCheckBoxなのでtrueかfalseで)指定


ここまで共通。

以下androidのver.によってプリファレンスのアクティビティ.javaファイルの記述が異なる。

・3.0より前・・・→ PreferenceActivityの派生クラスを使う
・3.0~ ・・・・→ PreferenceFragmentの派生クラスを使う

PreferenceActivity
PreferenceFragmentの違いです。

PreferenceFragmentを使用する際には、extendsをPreferenceFragmentに書き換えるだけでなく、
Fragmentを使用するために少々クラスの構成を変える必要があります。
(自分はこれが分からずに、二日ぐらい唸っていました

・3.0より前

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Prefs extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}

もちろん アクティビティ.PrefsをAndroidManifest.xmlに登録することを忘れずに。


1.addPreferenceFromResource()はXMLからプリファレンスの定義を読み出し、現在のビューに追加する。


・3.0~
注意点としては「FragmentはActivity内にstaticクラスとして作成すること」、「getFragmentManager().beginTransaction().replace(android.R.id.content,new PrefsFragment()).commit();」をActivityのonCreate()内に書き込む。

import android.os.Bundle;
import android.app.Activity;
import android.preference.PreferenceFragment;

public class Prefs extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PrefsFragment()).commit();
}



public static class PrefsFragment extends PreferenceFragment{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings(プリファレンスのxmlファイル名));
}
}
}



1.getFragmentManager().beginTransaction().replace(android.R.id.content,new PrefsFragment()).commit();
どうやらこのコードはFragment(PreferenceFragmentに限らず)を使用する時の雛形コードらしい。
2.android.R.id.contentは、layout/xmlファイルが含まれている場所を指す。

正直ここら辺はフラグメントの機能を勉強してないので、コードを丸写しした。。


コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://kamiyasu2.blog.fc2.com/tb.php/3-0b12331e

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。