我当前正在尝试为我的应用程序实现上下文菜单,其中有一系列任务,当用户长按一个时,将出现一个上下文菜单,该菜单为用户提供了一些取决于他选择的项目的选项。
实现菜单本身并不难,我的实现给出了我期望的结果:
Dim strFilepath = "c:\store-3" 'Specify path details
Dim directory As New System.IO.DirectoryInfo(strFilepath)
Dim File2 As System.IO.FileInfo() = directory.GetFiles("*", SearchOption.AllDirectories)
Dim File1 As System.IO.FileInfo
For Each File1 In File2
Dim strLastModified As String
strLastModified = File1.DirectoryName & "\" + File1.Name & ">Date:" & System.IO.File.GetLastWriteTime(strFilepath & "\" & File1.Name).ToShortDateString()
ListBox1.Items.Add(strLastModified)
Next
但是要处理用户点击,麻烦就来了,发生了奇怪的事情:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if(v.getId() == R.id.list){ //check if the click comes from the listview
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
menuChoosenTask = taskAdapter.getItem(info.position); //retrive the choosen task
Log.e("CreateMenu", "Choose item with name " + menuChoosenTask.getTaskName());
menu.setHeaderTitle(menuChoosenTask.getTaskName());
int options = 3;
if(menuChoosenTask.getTypeOfTask() == WeeklyTask.TYPE_TASK_WORK) options = 4;
for(int i = 0; i < options; i++){
menu.add(Menu.NONE, i, i, menuOptions[i]);
}
}
}
当我尝试检索@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final int menuItemIndex = item.getItemId();
menuChoosenTask = taskAdapter.getItem(info.position);
int choosenTaskId = menuChoosenTask.getId();
String selectedOption = menuOptions[menuItemIndex];
if(selectedOption.equals(getString(R.string.cm_option_edit))){
//DO STUFF
}
if(selectedOption.equals(getString(R.string.cm_option_delete_for_everyday))){
//DO STUFF
}
if(selectedOption.equals(getString(R.string.cm_option_delete_for_this_day)){
//DO STUFF
}
return true;
}
时会出现问题,由于某种原因taskAdapter可能会减小其大小,也就是说,与我在调试器中看到的一样:创建菜单menuChoosenTask
时的大小为taskAdapter
,而4
的大小为info.position
,所以没有问题,但是当我单击时,3
仍然为info.position
,但是现在3
的大小为{ {1}}。
因此,我首先尝试通过将taskAdapter
设置为全局变量来解决此问题,并在创建菜单时将其设置为状态,并在用户选择一个选项时重新使用它,但是由于某些原因,变量失去了它的状态当一个选项被选中并变成2
时。
我的问题是:如何检索对象以及为什么发生这些奇怪的事情?
编辑:
我设法缩小了范围:您看到的2个函数在一个名为DayFragment的类中,并且其中一个变量是由children类在调用时设置的,因此基本上发生的是第一个方法(菜单创建) )是从一个孩子调用的(假设是第二个,也是我所看到的:屏幕上的一个),但是第二个方法(选项选择)是从另一个孩子调用的,这是该类的完整代码加一个的子类:
DayFragment.java:
menuChoosenTask
其中一个子类(共有7个子类):
null
所有这些片段都显示在PagerAdapter(与视图分页器结合)中,因此我“很高兴”了解为什么会发生这种情况,但我不知道如何防止它发生。
答案 0 :(得分:0)
好吧,好吧,我花了一个半小时的时间在谷歌上搜索,终于找到了解决方法:
Wrong fragment in ViewPager receives onContextItemSelected call
由于我不完全了解发生了什么问题,所以花了很长时间才找到它。因此,我很抱歉,为所有麻烦感到遗憾