【问题标题】:onCreateOptionsMenu called before onCreate androidonCreateOptionsMenu 在 onCreate android 之前调用
【发布时间】:2013-02-07 05:53:35
【问题描述】:

我是 android 的初学者,我正在开发小型 android 应用程序。在我的应用程序中,我使用的是 Sherlock 库。我的应用程序包含一个主要活动和两个片段。我的列表片段结构看起来像

public class MyCards extends SherlockListFragment
        {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside fragment on create");

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on activity created");
    }

    private void displayCards(int type) {

        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside display cards");

    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onPause() {
        super.onPause();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.mycards, container, false);

        View view1 = inflater.inflate(R.layout.empty_card, container, false);
        return view;

    }

    /*@Override
    public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    optionsMenu = menu;
    }*/

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_type2, menu);

        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on create option menu");
        Spinner spinner = (Spinner) menu.findItem(R.id.cardType)
                .getActionView();

        SpinnerAdapter adapter = ArrayAdapter.createFromResource(getSherlockActivity().getSupportActionBar().getThemedContext(), R.array.card_action_list,android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter); // set the adapter

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                displayCards(pos);
                Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on option selected");
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                displayCards(0);
                Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on no option selection");
            }

        });


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside option select listener");

    }

}

现在我的问题是,当我第一次从一个片段切换到另一个片段时 它给出以下日志输出

01-04 00:54:06.997: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on create option menu
01-04 00:54:06.997: W/KeyCharacterMap(2575): No keyboard for id -1
01-04 00:54:06.997: W/KeyCharacterMap(2575): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-04 00:54:07.020: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside fragment on create
01-04 00:54:07.036: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on activity created

这意味着在 onfragment create 和活动 create 之前调用的 create 选项。它还给出了两个警告。这项工作没有任何错误。但我无法显示我的列表视图

现在当我再次切换到同一个片段(第二次)时,它会给出以下日志输出

02-07 10:05:10.983: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on create option menu
02-07 10:05:11.023: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside fragment on create
02-07 10:05:11.043: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on activity created
02-07 10:05:11.113: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside display cards
02-07 10:05:11.133: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on option selected

这一次它没有发出任何警告并且工作正常。还显示我的列表视图。 但是第一次它不能正常工作.. 另一点是,当我在更高版本的 android 上运行它时,它工作正常。但是如果我在 2.3.3 等较低版本的 android 上运行它,我会表现出这样的行为.. 我读到了这个ListFragment onPrepareOptionsMenu called before onCreate. Why and How to Fix / Bypass? 但我无法解决这个问题。

如果我在onActivityCreated 中定义setHasOptionsMenu(true),它会给出以下输出

01-04 03:32:38.622: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside fragment on create
01-04 03:32:38.653: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on activity created
01-04 03:32:38.692: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on create option menu
01-04 03:32:38.700: W/KeyCharacterMap(8157): No keyboard for id -1
01-04 03:32:38.700: W/KeyCharacterMap(8157): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

我还尝试为我的片段设置 setHasOptionsMenu,其中实际片段事务发生如下..

@Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            MyCards mc = new MyCards();
            mc.setHasOptionsMenu(true);
            ft = mActivity.getSupportFragmentManager().beginTransaction();

                mFragment = Fragment.instantiate(mActivity, mClass.getName(),
                        mArgs);

                ft.add(android.R.id.content, mFragment, mTag);
                ft.commit();
            }

但它仍然给出同样的问题。

我的代码或其他问题有什么问题吗? 那么如何解决这个问题。 需要帮忙... 谢谢...

【问题讨论】:

  • 你确定不是因为你在登录onCreate之前调用了setHasOptionsMenu
  • 您好 zharf,谢谢您的回复。查看我编辑的问题.. 并更改了日志输出.. 但这并不能解决我的问题..

标签: android actionbarsherlock android-listfragment android-optionsmenu


【解决方案1】:

onActivityCreated(Bundle savedInstanceState)方法中写入setHasOptionsMenu(true);

【讨论】:

  • 推理:对于某些版本,支持库将在调用 setHasOptionsMenu(true) 时立即创建菜单栏...如果您需要布局已经膨胀,这可能会导致错误,或者需要从膨胀的布局中填充一些实例变量。
【解决方案2】:

我不知道为什么会这样,但是这样做: 将片段添加到其中时,在 Activity 中设置选项 setHasOptionsMenu(true)

例如:

//Activity class
YourListFragment f = new YourListFragment();

f.setHasOptionsMenu(true); //here

getSupportFragmentManager().beginTransaction()
.add(R.id.your_list_fragment_container, f).commit();

并删除片段代码中的设置。它对我有用。

【讨论】:

  • 嗨,michal,感谢您的快速回复。我尝试了您的解决方案。在我的应用程序中,我正在使用标签。在我的 ontabselected 方法中,我尝试了您的解决方案,但它对我不起作用。我尝试了以下方式 .MyCards my_card = new MyCards()my_card.setHasOptionsMenu(true).... 但它不起作用。这种方法甚至不适用于我的最新版本的android。任何其他解决方案。谢谢你的帮助...
  • 这个方法根本行不通是什么意思?它在 android 2.3 上和 4.2 上一样好用。
  • 嗨,迈克尔,谢谢您的回复。我在 2.3.3 和 ics 版本上尝试过,但它不起作用...我的代码有什么问题...需要帮助。
  • 标签活动的邮政编码,或者至少是你实际添加片段的一部分。
  • Michal 你能看看我编辑过的问题吗?在 onTabSelected 我试图设置 setHasOptionsMenu 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多