これは、先週投稿した質問 (リストが空の場合、ListActivity からオプション メニューが開かない) のフォローアップです。オプションメニューの問題はかなり複雑で、気が弱い人向けではありません.
私のプロジェクトは、オプション メニューで ListActivity として使用します。ListActivity はアクティビティ グループ内から開始されます。(特定のタブ内のアクティビティを後方に移動するために「戻る」ボタンが適切に機能するように、アクティビティ グループ内で使用します。)
オプション メニューは、リストにデータが提供されている限り、完全に機能します。ただし、データがない場合、オプション メニュー ボタンはオプション メニューをトリガーしません。
ただし、オプション メニューは、ListActivity が ActivityGroup 内から開始されていない場合、空のリストを持つ ListActivity に対して機能します。
問題を再現するために、ActivityGroup クラス (TabsFirstGroup) 内から開始された ListActivity クラス (MsgList) を使用して、非常に単純化された例を作成しました。
MsgList の 30 行目 (リストにデータを提供する配列を設定する場所) をコメントアウトするとwords.add(s);
、オプション メニューのインスタンス化に失敗します。ヒットしないデバッグ ブレーク ポイントを設定することで推測されるように、MsgList 内の onCreateOptionsMenu() メソッドに到達することはありません。
これが TabsFirstGroup クラスです。
import java.util.ArrayList;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class TabsFirstGroup extends ActivityGroup {
// Keep this in a static variable to make it accessible for all the nesten activities, lets them manipulate the view
public static TabsFirstGroup group;
// Need to keep track of the history if you want the back-button to work properly, don't use this if your activities requires a lot of memory.
private ArrayList<View> history;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.history = new ArrayList<View>();
group = this;
View view = getLocalActivityManager().startActivity("MsgListActivity", new
Intent(this,MsgList.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
replaceView(view);
}
public void replaceView(View v) {
// Adds the old one to history
history.add(v);
// Changes this Groups View to the new View.
setContentView(v);
}
public void back() {
if(history.size() > 0) {
history.remove(history.size()-1);
setContentView(history.get(history.size()-1));
}else {
finish();
}
}
@Override
public void onBackPressed() {
TabsFirstGroup.group.back();
return;
}
}
MsgList クラスは次のとおりです。
package com.techmeridian.testframework;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.ArrayAdapter;
public class MsgList extends ListActivity {
private static final String[] items={"lorem", "ipsum", "dolor",
"sit", "amet", "consectetuer", "adipiscing", "elit",
"morbi", "vel", "ligula", "vitae", "arcu", "aliquet",
"mollis", "etiam", "vel", "erat", "placerat", "ante",
"porttitor", "sodales", "pellentesque", "augue", "purus"};
private ArrayList<String> words=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
words=new ArrayList<String>();
for (String s : items) {
// IF I COMMENT THE NEXT LINE OUT, THEN THE OPTION MENU WILL NOT WORK!
words.add(s);
}
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, words));
registerForContextMenu(getListView());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.option_menu, menu);
return true;
}
}
どんな援助でも大歓迎です。ありがとう。