我试过寻找解决方案,但没有发现任何符合我情况的解决方案.我有一个MainActivity,它扩展了FragmentActivity和多个ListFragments.我使用PagerSlidingTabStrip库作为slidetabs和一个ViewPager.片段没有XML布局,它们只是ListFragments,它返回ListView,因此不需要布局.
它是一个音板应用程序,长按一个列表项,允许用户将声音文件设置为铃声,通知或警报,或保存到SD卡.
现在,所有片段加载自己的数据就好了.一切似乎都没问题,但是,当我在后台加载的Fragment上使用上下文菜单时,似乎是使用了在它之前加载的第一个或前一个片段中的ListView,它是在创建它时可见的.
我的意思是,说我的MainActivity开始,它加载FragmentA,并在后台FragmentB也被预加载.
在onActivityCreated方法中,对于两个Fragments,它使用registerForContextMenu(getListView()).
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Data loading etc
MyAdapter adapter = new MyAdapter(getActivity(),
R.layout.data_row, data);
setListAdapter(adapter);
registerForContextMenu(getListView());
}
Run Code Online (Sandbox Code Playgroud)
但似乎正在发生的事情是FragmentB调用了registerForContextMenu(getListView()),它似乎采用了当前活动的ListView,这是FragmentA的列表.
所以,假设我选择从上下文菜单中保存文件.我长按了FragmentB的第一项,但它试图保存FragmentA的第一项.如果我只是点击列表项,它会像您期望的那样播放它自己的声音,但是上下文菜单命令使用预加载时可见的片段列表.
这是onCreateContextMenu.注意,此时它使用上下文菜单Title中的正确项Title.
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
menu.setHeaderTitle(data.get(info.position).getDataName());
MenuInflater inflater = this.getActivity().getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
Run Code Online (Sandbox Code Playgroud)
这是onContextItemSelected.
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int dataID = data.get(info.position).getDataID();
String dataName = data.get(info.position).getDataName();
Activity activity = getActivity();
if(activity instanceof …Run Code Online (Sandbox Code Playgroud)