2016-05-17 135 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張貼的事件類型。

相關問題