2016-05-17 84 views
1

我在一个Android应用程序中有两个片段。如何实现从片段A到片段B的监听器?

这是片段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一个项目,我想的是,当用户选择一个列表项,片段B可以读取该选择。

如何更改我的代码来执行此操作?

问候

+0

:您能否请您在加载fragmentA和片段B好友时发布代码:) –

+0

我已添加代码 – bircastri

+0

您应该致电在你的'AlertsAgentDialogFragment'中有''onDataPass' ..类似** listner.onDataPass()**。 –

回答

2

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

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

这在这三个步骤来实现:

  1. 定义一个接口
  2. 实现接口
  3. 邮件传递到片段

所以,我假设你有一个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

public static final String FRAGMENT_TAG = "fragment_b_tag"; 

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

,也是你的FragmentB需要impleme:

要该标签的FragmentB,当你表明片段,你需要执行这个代码相关联nt一个方法(我称之为setYourString()),用于管理由FragmentA传递的数据。

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

0

应该总是发生两个片段之间的通信是通过它的活动

创建一个接口并在Activity中提供它的实现,然后当用户选择了Fragment A中的一个项目时,使用Activity中的项目调用接口的方法,然后从Activity将该项目发送给Fragment 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

+0

我不能使用活动,因为我有一个主活动,我改变了一些片段。 – bircastri

+0

你的碎片是你主人活动ryt的一部分吗?在主活动中实现接口。 – Ritesh

0

片段基本上由活动控制。 如果您已将活动的上下文保存在FragmentA中,则可以从FragmentA调用该活动的方法,然后调用FragmentB的方法。

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

,然后在活动

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

但是你要确保fragmentB被初始化,而不是空。

1

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

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

相关问题