1

这是我上周发布的一个问题的后续行动(当列表为空时,选项菜单不会从 ListActivity 打开。)我已经做了一些工作来缩小我遇到的问题。选项菜单的问题相当复杂,不适合胆小的人。

我的项目用作带有选项菜单的 ListActivity。ListActivity 从活动组内启动。(我在活动组中使用它,以便“后退”按钮可以正常工作,以便通过特定选项卡中的活动向后移动。)

只要有为列表提供的数据,选项菜单就可以完美运行。但是,如果没有数据,选项菜单按钮将不会触发选项菜单。

但是,选项菜单确实适用于具有空列表的 ListActivity,前提是 ListActivity 不是从 ActivityGroup 中启动的。

为了重现这个问题,我使用从 ActivityGroup 类 (TabsFirstGroup) 中开始的 ListActivity 类 (MsgList) 创建了一个非常精简的示例。

如果我在 MsgList 中注释掉第 30 行(我在其中填充为列表提供数据的数组words.add(s);),选项菜单将无法实例化。我从来没有到达 MsgList 中的 onCreateOptionsMenu() 方法,这是通过设置一个永远不会被命中的调试断点推断出来的。

这里是 TabsFirstGroup 类:package com.techmeridian.testframework;

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