【问题标题】:Variable's address is different inside onContextItemSelectedonContextItemSelected 内部变量的地址不同
【发布时间】:2019-01-16 21:01:53
【问题描述】:

我有一个自定义类的单个实例,在 Fragment 中声明了“遇到”,如下所示:

public class EncounterStrategyFragment extends Fragment
                                   implements DialogConfirm.NoticeDialogListener{

    private MalifauxEncounter encounter;

此对象包含一个列表。它提供给按预期工作的自定义列表适配器。适配器附加到的 ListView 已通过 registerForContextMenu(listview); 注册为上下文菜单。

我的问题是 'encounter's address/id 在 OnContextItemSelected 回调方法中发生变化。 这是 Fragment 中其他任何地方的“遭遇”状态:(id=830047711760, array size = 10)

但在 OnContextItemSelected 内部它变成了这样:(id=830055767320, internal array size = 0)

我会发布图片,但我的声誉不够高......

在 OnContextItemSelected 之外,地址与最初相同,因此不会重新创建 '遭遇对象;只有这种单一方法不同。因此,我尝试在 OnContextItemSelected 中执行的任何修改都会导致错误。

在我将此片段作为 ActionBar 选项卡结构的一部分之前,我的实现工作正常。

这到底是怎么回事?

编辑: 解决方案:我的问题的根本原因是操作栏选项卡管理器代码创建了两次片段。 OnContextItemSelected 使用来自 Fragment 的第二个实例的“encounter”变量,而另一个源使用的是第一个实例的副本。使用此帖子解决: Fragment onCreateView and onActivityCreated called twice

【问题讨论】:

  • 发布复制问题所需的最少代码量。在编写代码时,您很可能会自行找到问题的根源。
  • 当您尝试制作一个最小的示例来向我们展示发生了什么时,请发布您的 onContextItemSelected() 方法。

标签: java android


【解决方案1】:

我的问题的根本原因是操作栏选项卡管理器代码创建了两次片段。 OnContextItemSelected 方法使用来自 Fragment 的第二个实例的 'encounter' 变量,而另一个源使用来自第一个实例的副本。使用此帖子解决:Fragment onCreateView and onActivityCreated called twice

【讨论】:

    【解决方案2】:

    可能有人卡在onContextItemSelected 中返回的错误数据。在我的例子中,我使用 ViewPager 基于一个片段和内部的上下文菜单。

    如果您遇到这种情况,请参阅Wrong fragment in ViewPager receives onContextItemSelected call

    例如,

    override fun onContextItemSelected(item: MenuItem?): Boolean {
        return if (userVisibleHint) {
            // Handle menu events and return true
            true
        } else
            false // Pass the event to the next fragment
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 2023-03-03
      • 2014-04-24
      • 2014-01-22
      • 2017-12-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多