Android:单击上下文菜单项会导致变量更改状态

时间:2018-08-19 10:58:24

标签: android variables memory contextmenu object-lifetime

我当前正在尝试为我的应用程序实现上下文菜单,其中有一系列任务,当用户长按一个时,将出现一个上下文菜单,该菜单为用户提供了一些取决于他选择的项目的选项。

实现菜单本身并不难,我的实现给出了我期望的结果:

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(与视图分页器结合)中,因此我“很高兴”了解为什么会发生这种情况,但我不知道如何防止它发生。

1 个答案:

答案 0 :(得分:0)

好吧,好吧,我花了一个半小时的时间在谷歌上搜索,终于找到了解决方法:

Wrong fragment in ViewPager receives onContextItemSelected call

由于我不完全了解发生了什么问题,所以花了很长时间才找到它。因此,我很抱歉,为所有麻烦感到遗憾