2012年03月08日

メニューを動的にカスタマイズする


オプションメニューを状況に合わせて変化させたいと思います
まずはxmlでオプションメニューを2つ追加します
xmlリソースファイルでメニューを作成する
今回はitem1とitem2を設置しました
xmlファイルは
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/item1" android:visible="true" android:enabled="true" android:title="item1" android:icon="@android:drawable/ic_menu_search"></item>
    <item android:id="@+id/item2" android:title="item2" android:visible="true" android:enabled="true" android:icon="@android:drawable/ic_menu_rotate"></item>
</menu>

次にjavaソースですがmenuを作成するときは
onCreateOptionsMenuを使用しました
これはmenuが表示されるとき初回のみ実行されます
表示ごとに変更したい場合は
onPrepareOptionsMenuを使用します
これは表示される毎に実行されるためメニュー内容を動的に変更することができます
今回は初回表示時は2つのオプションメニューが表示されますがitem1を押すと
swがfalseに変化しitem1が非表示に、item2が選択不可になっています
package blog.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

 
public class TestActivity extends Activity {
boolean sw;
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    sw=true;//swの初期状態を設定
	}

	
	//オプションメニューを追加
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}
	/**onPrepareOptionsMenu は MENU ボタンを押したときに呼ばれる(毎回)**/
	@Override
	public boolean onPrepareOptionsMenu(Menu menu){
			if(sw ==false){
			//item1を非表示にitem2を選択不能にします
			menu.findItem(R.id.item1).setVisible(false);
			menu.findItem(R.id.item2).setEnabled(false);
			}
		return true;
	}
	

	/**onOptionsItemSelected はメニュー項目を選択した時に自動的に呼ばれる**/
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		/**item1を押したとき**/
		case R.id.item1:
			Log.i("tag","item1が押されました");
			sw=false;
			return true;
		}
		return false;
	}

}
setVisible(false)で非表示に(trueで表示)
setEnabled(false)で選択不可(trueで選択可能)にしています

最初は2つのitemが表示されますが・・・
device33.png
item1を押すと・・・・
device34.png
このように変化します

また今回は使用していませんがOptionsMenu関連メソッドは以下の通りです
public void closeOptionsMenu()
メニューを閉じます(閉じられていれば何もしません)

public boolean onCreateOptionsMenu(Menu menu)
メニュー生成時に呼び出されます(初回のみ)

public boolean onOptionsItemSelected(MenuItem item)
メニュー項目を通知します

public boolean onPrepareOptionsMenu(Menu menu)
メニューが表示される前に呼ばれます(毎回)

public void onOptionsMenuClosed (Menu menu)
メニューを閉じるときに呼ばれます(毎回)

public void openOptionsMenu()
メニューを開きます(開かれていたら何もしません)

スポンサードリンク

posted by kenken at 13:47 | Comment(0) | TrackBack(0) | ウィジェット メニュー | このブログの読者になる | 更新情報をチェックする
2012年03月07日

xmlリソースファイルでメニューを作成する


メニューはxmlリソースファイルにメニューを定義して
これを読み込んで表示させる事もできます

まずはresフォルダ下にmenuフォルダを作成します
resフォルダを右クリックし新規作成からフォルダーを選択します
device28.png
フォルダー名にmenuと入力し完了をクリックします

新しくmenuフォルダができたら今度はそのフォルダーを右クリックし
新規→Android XML ファイルを選んでください
device29.png
一覧にない場合はその他から探して選んでください
新規作成画面になったらファイルに名前を入れてください
今回はそのままmenuとしました(任意で変更可能)
完了を押すとメニュー作成画面になります
ここにItemなどを追加していきます

追加からItemを選択すると
のような画面になります
device30.png
それぞれ項目を入力していきます
最低限入力しなければならないのは以下の4つです
Id:idを入力 自動で入力されるが変更可能
Title:表示される文字を記入
Visible:表示されるかどうか
Enabled:ボタンとして押せるかどうか
今回はついでにIconも設定しました
device31.png
これでXmlファイルは完成です
次にjavaのソースコードを以下のようにします
package blog.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

 
public class TestActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	
	}
	
	//オプションメニューを追加
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}
	

	/**onOptionsItemSelected はメニュー項目を選択した時に自動的に呼ばれる**/
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		/**item1を押したとき**/
		case R.id.item1:
			Log.i("tag","item1が押されました");
			 return true;
		}
		return false;
	}
}
inflater.inflate(R.menu.menu, menu);で先ほど作成したmenuを指定しています
また、item1が選択された時Logが出力されるようになっています
device32.png
スポンサードリンク

posted by kenken at 17:27 | Comment(0) | TrackBack(0) | ウィジェット メニュー | このブログの読者になる | 更新情報をチェックする

メニュー項目の追加


メニューは項目数によって画面の表示が変化します
メニューは2段で最大6個までしか画面に表示することができません
7個以上の場合は"その他"をクリックすると拡張メニューとして表示されます
今回はメニューを表示されるたびItem数が増加していくプログラムです
メニューとコンテキストメニューも表示されるたび増えていきます
package blog.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
 
public class TestActivity extends Activity {
	//menuの表示順を定義
	private int optionsMenu = 1;
	private int contextMenu = 1;
	
	private Button button;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	
	    LinearLayout layout = new LinearLayout(this);
	    layout.setOrientation(LinearLayout.VERTICAL);
	    setContentView(layout);
	//buttonを追加
	    button = new Button(this);
	    button.setText("ボタン");
	    layout.addView(button);
	
	    registerForContextMenu(button);
	}
	
	//オプションメニューを追加
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		//表示されるたび追加
	    menu.add(String.format("Item%d", optionsMenu++));
	    return true;
	}
	
	//コンテキストメニュー追加
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
	        ContextMenuInfo menuInfo) {
		contextMenu++;
	  //表示されるたび追加
		for(int i=1;icontextMenu;i++)
	        menu.add(String.format("Item%d", i));
	}
}

メニューが1つのとき
device19.png
メニューが2つのとき
device20.png
メニューが3つのとき
device21.png
メニューが4つのとき
device22.png
メニューが5つのとき
device23.png
メニューが6つのとき
device24.png
メニューが6つ以上のときはその他になります
device25.png
それ以上のときその他を選択すると・・・
device27.png
スポンサードリンク

posted by kenken at 15:35 | Comment(0) | TrackBack(0) | ウィジェット メニュー | このブログの読者になる | 更新情報をチェックする

メニュー表示のカスタマイズ(2)


サブメニューの表示
オプションメニューにはサブメニューを追加することができます
オプションメニューを表示する
サブメニューの下にさらにサブメニューを追加する事はできません
またコンテキストメニューにはサブメニューを使用する事はできません
package blog.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
 
public class TestActivity extends Activity {
	//menuの表示順を定義
	private static final int FILE = Menu.FIRST;
	private static final int EDIT = Menu.FIRST+10;

	private static final int FILE_NEW = FILE+1;
	private static final int FILE_OPEN = FILE+2;
	private static final int FILE_SAVE = FILE+3;;
	 
	private static final int EDIT_UNDO = EDIT+1;
	private static final int EDIT_REDO = EDIT+2;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
    }
     
    //menu作成
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
		boolean result = super.onCreateOptionsMenu(menu);
		//menuとSubMenuを作成
		SubMenu fileMenu = menu.addSubMenu(Menu.NONE, FILE, Menu.NONE, "File");
		SubMenu editMenu = menu.addSubMenu(Menu.NONE, EDIT, Menu.NONE, "Edit");
		
		fileMenu.add(Menu.NONE, FILE_NEW, Menu.NONE, "new");
		fileMenu.add(Menu.NONE, FILE_OPEN, Menu.NONE, "open");
		fileMenu.add(Menu.NONE, FILE_SAVE, Menu.NONE, "save");
		 
		editMenu.add(Menu.NONE, EDIT_UNDO, Menu.NONE, "undo");
		editMenu.add(Menu.NONE, EDIT_REDO, Menu.NONE, "redo");
	return result;
	}
	
    //menuが押された時の処理
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case FILE_NEW:
            // ここにITEM1が押された時の処理を記述
            Log.i("tag","FILE_NEWが押されました");
            return true;
        case FILE_OPEN:
            // ここにITEM2が押された時の処理を記述
            Log.i("tag","FILE_OPENが押されました");
            return true;
        case FILE_SAVE:
            // ここにITEM1が押された時の処理を記述
            Log.i("tag","FILE_SAVEWが押されました");
            return true;
        case EDIT_UNDO:
            // ここにITEM2が押された時の処理を記述
            Log.i("tag","EDIT_UNDOが押されました");
            return true;
        case EDIT_REDO:
            // ここにITEM1が押された時の処理を記述
            Log.i("tag","EDIT_REDOが押されました");
            return true;
        }
        return false;
    }
     
     
     
}
「MENU」→「File」を選択するとサブメニューが表示されます
device18.png
スポンサードリンク

posted by kenken at 13:56 | Comment(0) | TrackBack(0) | ウィジェット メニュー | このブログの読者になる | 更新情報をチェックする