当前位置: 首页 > 知识库问答 >
问题:

片段接口回调未存储传递的值

申屠新觉
2023-03-14

接口

public interface GameSelectedListener {

public void onGameSelectedListener(int gameID, Boolean isCustom);
}

在附件中,我设置了游戏选择监听器在附件中。

public void onAttach(Activity Activity){super.onAttach(Activity);

gameSelectedListener = (GameSelectedListener)activity;

}

在代码的一部分发送了一些数据

gameSelectedListener.onGameSelectedListener(groupItems.get(groupPosition).iD, isCustom);

实现接口并在FragmentB中调用方法的主要活动

@Override
public void onGameSelectedListener(int gameID, Boolean isCustom) {
    // TODO Auto-generated method stub`enter code here`

    FB.setGameID(gameID, isCustom);


}

片段B内部是setGameID方法,它只在片段内部设置一些数据。

public void setGameID(int gameID, Boolean isCustom)
{
        this.gameID = gameID;
        this.isCustom = isCustom;
}

带有日志语句(此处未显示)。片段A生成的数据成功发送到main活动。我将片段B的setGameID方法中变量的值也正确地记录到片段A生成的值。

然而这里有个问题

使用FragmentB中的gameID和iCustom时,我会遇到空指针异常。所以我设置了一些默认值来检查它,我注意到setGameID中的值更改不会影响全局变量,即使在记录setGameID中的值时显示了正确的值。请注意,这两个变量在代码的其他任何地方都没有更改。只是在setGameID方法中。

我不知道这是否有帮助,但我的片段是java片段(不是基于XML的),在主要活动中,我创建了片段B的一个实例以调用setGameID。注:我仅在全球范围内声明。

FragmentB FB = new FragmentB();

这是目前为止的情况活动A-

编辑添加了更多代码:问题可能在这里。

gameSelectedListener.onGameSelectedListener(groupItems.get(groupPosition).iD, isCustom);
fragment = FragmentB.newInstance();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(Container.getId(), fragment, tag);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

我认为问题可能就在这里,因为我调用了侦听器,然后在片段B实例中创建了一个。会是这样吗?

共有2个答案

松思源
2023-03-14

当您将片段A替换为片段B时。

@Override
public void onGameSelectedListener(int gameID, Boolean isCustom) {
  ...// rest of the code
  Bundle args = new Bundle();
  args.putInt("id", gameID);
  args.putBoolean("bool", isCustom);
  FB.setArguments(args);

}

在片段B中

int value = getArguments().getInt("id");   
徐帅
2023-03-14

使用EventBus而不是侦听器!官方android文档中提到的这种设计模式简直是胡说八道!

https://github.com/greenrobot/EventBus

class FragmentB extends Fragment {

    private int id;

    public static FragmentB newInstance(int id){
         Bundle args = new Bundle();
         args.putInt("id", id);
         FragmentB frag = new FragmentB();
         frag.setArguments(args);
     }


    public void onCreate(Bundle b){
       super.onCreate(b);
       this.id = getArguments().getInt("id);
    }

}
 类似资料:
  • 这是我的代码,根据文档,它是用于: 我在这里找到了一个解决方案,但我并不真正理解它,因为它是用编写的,我也不理解。我需要帮助!! ---编辑----

  • 问题内容: 给定您具有接受功能的场景。如果确定是切片,我如何在该切片上? 前往游乐场示例:http://play.golang.org/p/DNldAlNShB 问题答案: 好吧,我曾经使用过,然后如果它是一个切片,则可以调用,并在该值上调用以在索引处获取切片和元素的。我认为您将无法使用范围操作来做到这一点。 前往游乐场示例:http : //play.golang.org/p/gQhCTiwPA

  • 问题内容: 短 以下代码不能完全满足您的期望:https : //play.golang.org/p/sO4w4I_Lle 我以为我像往常一样弄乱了一些指针/引用的东西,但是我希望我的… …和… …以相同的方式运行(例如,更新作为第二个参数传递的引用)。 长 上面的示例是一个没有太多意义的最小复制器。这是为了使其能够在操场上工作。但是,一个不那么有意义的最小示例是: 想法是将YAML解组为(而不是

  • 这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.

  • P.P.S@Philipp Jahoda,我实现了onCreateOptionsMenu(...)在片段的托管活动中。