如何实现从Fragment A到Fragment B的监听器?

时间:2016-05-17 07:15:28

标签: android android-fragments android-recyclerview

我在一个Android应用程序中有两个片段。

这是片段A:

    public class AlertsAgentDialogFragment extends DialogFragment {
        ...
        ...
        OnDataPass dataPasser;

        public interface OnDataPass{
            public void onDataPass(String data);
        }

        ...
    }

public class AgentClickListener implements View.OnFocusChangeListener {
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus) {
                AlertsAgentDialogFragment dialog = AlertsAgentDialogFragment.newInstance(listValueSet_Agent);
                dialog.show(getActivity().getFragmentManager(),"");
            }
        }
    }

这是片段B

public class AlertsDialogFragment extends DialogFragment implements AlertsAgentDialogFragment.OnDataPass {
    ...
    ...
    public AlertsDialogFragment() {
        mContext = getActivity();
    }
    ...
    ...
    @Override
    public void onDataPass(String data) {
        // TODO Auto-generated method stub
        AlertsAgentDialogFragment transaction1 = ((AlertsAgentDialogFragment) getFragmentManager().findFragmentByTag("ItemRoleList"));
        transaction1.dataPasser.onDataPass(data);
    }
    ...
}

在片段A中,用户可以从RecycleListView中选择一个项目,我希望当用户选择一个List项时,片段B可以读取此选择。

如何更改代码才能执行此操作?

问候

4 个答案:

答案 0 :(得分:2)

基本思想是您不必直接将数据从一个片段传递到另一个片段。

As the documentation says,您必须将数据从一个Fragment传递给Activity,然后Activity将这些数据传递给另一个Fragment。

这是通过以下三个步骤实现的:

  1. 定义界面
  2. 实施界面
  3. 向片段发送消息
  4. 所以,我假设你有一个Activity,其中包含片段A和片段B.想法是在片段A中创建接口,就像你一样,然后你的Activity必须实现该接口:

    public class MyActivity extends Activity implements AlertsAgentDialogFragment.OnDataPass {
         @Override
        public void onDataPass(String data) {
            FragmentB fragment = (FragmentB)getFragmentManager().findFragmentByTag(FragmentB.FRAGMENT_TAG);
            if(fragment!=null)
                fragment.setYourString(data);
        }
    }
    

    FragmentB包含表示TAG的常量String

    public static final String FRAGMENT_TAG = "fragment_b_tag";
    

    要将该标记与FragmentB相关联,当您显示该片段时,需要执行以下代码:

    fragment.show(getFragmentManager(), FragmentB.FRAGMENT_TAG);
    

    你的FragmentB还需要实现一个方法(我称之为setYourString())来管理FragmentA传递的数据。

    之后你就完成了:管理传递数据的所有逻辑都在setYourString()方法中。

答案 1 :(得分:1)

您也可以使用事件模型,例如OttoRxAndroid

您为这两个片段提供相同的总线。片段B将订阅将由片段A发布的事件类型。

答案 2 :(得分:0)

两个片段之间的通信应始终通过活动进行。

创建一个接口并在Activity中提供它的实现,然后当用户在Fragment A中选择一个项目时,使用Activity中的项目调用接口的方法,然后从Activity将该项目发送到片段B。

像这样......

    public class FragmentB extends Fragment{
        public void getItemFromFragA(String item){
            // your code
        }
    }


    public class FragmentA extends Fragment{

        ItemClicked mItemClicked;

        public interface ItemClicked{
            public void sendItem(String item);
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);

            try {
                mItemClicked = (ItemClicked) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString());
            }
        }

        public void someMethod(){
            mItemClicked.sendItem("Item or Object");
        }

        @Override
        public void onDetach() {
            mItemClicked = null
            super.onDetach();
        }
    }


public class MainActivity implements FragmentA.ItemClicked{
    @Override
    public void sendItem(String item){

        FragmentB fragmentB = (FragmentB)
            getSupportFragmentManager().findFragmentById(R.id.your_fragment_B);
        fragmentB.getItemFromFragA(item);
    }
}

查看此链接以获取信息......

https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

答案 3 :(得分:0)

碎片基本上是从活动中控制的。 如果你已经在FragmentA中保存了活动的上下文,你可以从FragmentA调用该活动的方法,然后调用FragmentB的方法。

((YourActivity)context).listItemClicked(arg1,arg2,arg3);

然后在你的活动中

public void listItemClicked(arg1,arg2,arg3){
    fragmentB.listItemClicked(arg1,arg2,arg3);
}

但是你需要确保fragmentB被初始化而不是null。