ViewPager中的错误片段接收onContextItemSelected调用

Vee*_*eti 25 android android-support-library

我有一个应用程序,在a中显示一些片段(相同类型)ViewPager,我在上下文菜单项中遇到了一些问题.(我正在使用支持库).

当在其中一个片段的上下文菜单中选择了上下文菜单项时,错误的片段正在接收onContextItemSelected事件调用.

例如,如果我在寻呼机中的片段#3上,则位置#2处的片段接收它.如果我滑回到片段#2,则片段#3接收该呼叫.

我在这里有样品.

(我现在正在我自己的应用程序中解决这个问题,方法是mHandleContext在每个片段中都有一个变量,并在页面更改时启用/禁用它.这样,onContextItemSelected调用将会发送到所有片段,直到调用正确的片段.)

我做错了什么或这是支持库的错误?作为旁注,我在使用ActionBarSherlock 3.5.1时没有发生这种情况,ActionBarSherlock 3.5.1有自己的支持库分支.

Vee*_*eti 37

所以这是谷歌的某种愚蠢的设计决定,或者刚刚完全没有考虑的事情.解决此问题的最简单方法是onContextItemSelected使用if语句包装调用:

if (getUserVisibleHint()) {
    // Handle menu events and return true
} else
    return false; // Pass the event to the next fragment
Run Code Online (Sandbox Code Playgroud)

ActionBarSherlock 3.5中的兼容性库有这样的hack.


Ser*_*aph 14

它发生的原因是:

public boolean dispatchContextItemSelected(MenuItem item) {
    if (mActive != null) {
        for (int i=0; i<mAdded.size(); i++) {
            Fragment f = mAdded.get(i);
            if (f != null && !f.mHidden) {
                if (f.onContextItemSelected(item)) {
                    return true;
                }
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,FragmentManager为其所有自己的片段调用Fragment.onContextItemSelected,直到它返回true.在您的示例中,我可以提供此类修复:

    public static class TestListFragment extends ListFragment {

    private int mNumber = 0;
    private ArrayList<String> mItems;

    public static TestListFragment newInstance(int number) {
        Bundle args = new Bundle();
        args.putInt("number", number + 1);

        TestListFragment fragment = new TestListFragment();
        fragment.setArguments(args);

        return fragment;
    }

    public TestListFragment() {}

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

        mNumber = getArguments().getInt("number");
        mItems = new ArrayList<String>();
        mItems.add("I am list #" + mNumber);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mItems));
        registerForContextMenu(getListView());
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(mNumber, 0, 0, "Hello, World!");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getGroupId() == mNumber){
            Log.d("ViewPagerContextMenuBug", "onContextItemSelected called for number " + mNumber);
            Toast.makeText(getActivity(), "onContextItemSelected called for number " + mNumber, Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }

}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

4565 次

最近记录:

7 年,6 月 前