介面

public interface GameSelectedListener {

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


在FragmentA中的附件中,我将gameSelectedListener设置在附件中。

公共无效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);


}


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

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


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

但是这里是问题

使用来自FragmentB的gameID和isCustom时,出现空指针异常。因此,我设置了一些默认值进行检查,我注意到即使在setGameID中记录值显示正确的值时,在setGameID中进行的值更改也不会影响全局变量。请注意,这两个变量在代码中的其他位置均未更改。只是在setGameID方法中。

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

FragmentB FB = new FragmentB();


到目前为止的样子
活动A->片段事务添加片段A->从片段A按钮单击->片段A替换为B

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

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实例。可以吗?

最佳答案

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

}

关于java - fragment 接口(interface)回调不存储传递的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25329956/

10-12 01:26