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

时间:2014-08-15 16:05:36

标签: java android interface

界面

public interface GameSelectedListener {

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

在附加的FragmentA内部我将gameSelectedListener设置为on attach。

public void onAttach(活动活动) { super.onAttach(活性);

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);


}

Inside Fragment B是setGameID方法,它只在该片段中设置一些数据。

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

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

但问题是

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

我不知道这是否有帮助,但我的片段是java片段(不是基于XML的) 在主要活动中,我创建了一个Fragment B的实例,以便调用setGameID。注意我只在全局区域中声明它。

FragmentB FB = new FragmentB();

到目前为止看起来如何 活动A - >片段交易添加片段A - >从片段A按钮单击 - >片段用B替换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();

我认为这个问题很可能就在这里因为我调用了监听器然后创建了一个Fragment B实例。这可能吗?

2 个答案:

答案 0 :(得分:1)

使用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);
    }

}

答案 1 :(得分:1)

当你用片段B替换片段A时。

@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");