1

これは、先週投稿した質問 (リストが空の場合、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;
    }        
}

どんな援助でも大歓迎です。ありがとう。

4

0 に答える 0