Меню параметров не открывается из ListActivity, когда список пуст, если ListActivity запускается из ActivityGroup - PullRequest
1 голос
/ 16 августа 2011

Это продолжение вопроса, который я разместил на прошлой неделе ( Меню параметров не открывается из ListActivity, когда список пуст .) Я проделал некоторую работу, чтобы сузить проблему, с которой я столкнулся.Проблема с меню опций довольно запутанная и не для слабонервных.

Мой проект использует функцию ListActivity с меню параметров.ListActivity запускается из группы действий.(Я использую его внутри группы действий, так что кнопка «назад» будет работать правильно для перемещения назад по действиям на определенной вкладке.)

Меню параметров работает отлично, если есть данные, предоставленные длясписок.Однако, если нет данных, кнопка меню параметров не вызовет меню параметров.

Меню параметров, однако, работает для ListActivity с пустым списком при условии, что ListActivity не запускается из ActivityGroup.

Чтобы воссоздать проблему, я создал очень оченьурезанный пример использования класса ListActivity (MsgList), запущенного из класса ActivityGroup (TabsFirstGroup.)

Если я закомментирую строку 30 в MsgList (где я заполняю массив, который предоставляет данные для списка, words.add(s);) меню параметров не будет создано.Я никогда не доходил до метода onCreateOptionsMenu () внутри MsgList, что определяется путем установки точки прерывания отладки, которая никогда не срабатывает.

Вот класс 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;
    }        
}

Любая помощь будет принята с благодарностью.Спасибо.

...