2

在我的应用程序中,我有一个扩展SherlockFragmentActivity的类。在该 Activity 中,我正在加载四个扩展SherlockFragment的类,这些类在ActionbarSherlockPagerSlidingTabStrip的帮助下伪装成Tab

扩展SherlockFragment的类有setHasOptionsMenu(true); onCreate()方法中。即使这样,在运行应用程序时,它也不会调用onCreateOptionsMenu()方法。

我在 SO 中阅读了这些类似的问题(Q1Q2)并且没有得到任何帮助。

这可能是什么原因?


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.record, menu);
    super.onCreateOptionsMenu(menu, inflater);
    Log.i(TAG, "* onCreateOptionsMenu");
}

更新:

我认为原因是,我在另一个 SherlockFragment 中使用了 SherlockFragment。PageSlidingTabStripFragment.java中的方法在MyPagerAdapter有以下方法。

@Override
public SherlockFragment getItem(int position) {
    return SuperAwesomeCardFragment.newInstance(position);
}

我正在做的是,我正在从那里调用其他一些 SherlockFragments,如下所示。

@Override
public SherlockFragment getItem(int position) {
    Log.i(TAG, "* getItem");

    switch (position) {
        case 0:
            return new InnerSherlockFragmentOne();
        case 1:
            return new InnerSherlockFragmentTwo();
        case 2:
            return new InnerSherlockFragmentThree();
        case 3:
            return new InnerSherlockFragmentFour();
        default:
            return null;
    }
}

没有调用的是那些 InnerSherLockFragments 中的onCreateOptionsMenu(Menu menu, MenuInflater inflater)

4

3 回答 3

4

进口应该是:

import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

而不是这些安卓操作系统!

也尝试调用super方法,如:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.record, menu);

    Log.i(TAG, "* onCreateOptionsMenu");
}
于 2013-11-19T10:43:04.637 回答
2

我最近有同样的问题。而且我的代码与您在 PagerSlidingTabStrip 中使用 Fragment 的代码非常相似...

我的解决方案是这样的。

我没有在我的片段中做任何事情,而是从 PageSlidingTabStripFragment.java 修复源

PageSlidingTabStripFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    adapter = new MainPagerAdapter(getChildFragmentManager());
    setHasOptionsMenu(true);
setRetainInstance(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.e("test", "Fragment onCreateOptionsMenu");
    int position = pager.getCurrentItem();

    if (position == 4) {
        inflater.inflate(R.menu.fragment_report_menu, menu);
    }

    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.board_list_menu_new:
            ReportFragment fragment = (ReportFragment) adapter.getItem(pager.getCurrentItem());
            fragment.onMyOptionItemSelected();
            break;
    }
    return super.onOptionsItemSelected(item);
}

而这一切。

这不是很干净的解决方案,应该在库中修复。:)

谢谢,伍拉姆

于 2014-03-11T04:07:34.950 回答
1

这是我编写的确切代码,它工作正常。

import android.os.Bundle;
import android.util.Log;

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

public class First extends SherlockFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        super.onCreate(savedInstanceState);
        Log.i("TAG", "* created");
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        menu.add("abcd").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add("efgh").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        Log.i("TAG", "* onCreateOptionsMenu");
    }
}
于 2013-11-19T15:48:03.383 回答