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 次 |
| 最近记录: |