2015-11-17 67 views
0

我讀了幾個地方(here,herehere)關於如何做到這一點,我試圖跟着他們,但即時通訊失蹤的東西,我不知道是什麼。我想從FragmentAlarm發送數據到FragmentHome。下面的代碼是我對此的嘗試。我試圖搞砸了一下。在android中的2個片段之間傳遞數據而不使用活動?

1)爲什麼我沒有得到任何輸出?

2)我也必須通過MainActivity爲了在兩個片段之間進行通信嗎?我試圖使用一個公共靜態方法結合FragmentStatePagerAdapter來「避免」使用MainActivity。但我不知道這是否可能。

預先感謝

FragmentAlarm

public class FragmentAlarm extends Fragment implements SeekBar.OnSeekBarChangeListener{ 

private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

private String mParam1; 
private String mParam2; 

public FragmentAlarm() { // Required empty public constructor} 

public static FragmentAlarm newInstance(String param1, String param2) { 
    FragmentAlarm fragment = new FragmentAlarm(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    //put any extra arguments that you may want to supply to this fragment 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.tab_alarm,container,false); 

    FragmentAlarm.newInstance(ARG_PARAM1,"test from alarm"); 
    FragmentHome.newInstance(ARG_PARAM1,"test from alarm"); 

    return v; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
     System.out.println("mParam1 " + mParam1); 
     System.out.println("mParam2 " + mParam2); 
    } 

    } 
} 

FragmentHome

public class FragmentHome extends Fragment implements ValuesLoadedListener, SwipeRefreshLayout.OnRefreshListener { 

private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 
private String mParam1; 
private String mParam2; 

public FragmentHome() {// Required empty public constructor } 

// TODO: Rename and change types and number of parameters 
public static FragmentHome newInstance(String param1, String param2) { 
    FragmentHome fragment = new FragmentHome(); 
    Bundle args = new Bundle(); 
    //put any extra arguments that you may want to supply to this fragment 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
     System.out.println("mParam1 " + mParam1); 
     System.out.println("mParam2 " + mParam2); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.tab_home,container,false); 

    FragmentAlarm.newInstance(ARG_PARAM1,"test from home"); 
    FragmentHome.newInstance(ARG_PARAM1,"test from home"); 

    ... 

    return v; 
} 

PagerAdapter

public class MyViewPagerAdapter extends FragmentStatePagerAdapter { 


private Context context; 
int icons[] = {R.drawable.ic_home, 
     R.drawable.ic_graph, 
     R.drawable.ic_bell_mid, 
     R.drawable.ic_settings}; 

public MyViewPagerAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    this.context = context; 
} 

@Override 
public Fragment getItem(int position) { 
    if(position == 0) // if the position is 0 we are returning the First tab 
    { 
     return new FragmentHome(); 
    } 
    else if (position == 1) 
    { 
     return new FragmentTrend(); 
    } 
    else if (position == 2) 
    { 
     return new FragmentAlarm(); 
    } 
    else 
    { 
     return new FragmentSetting(); 
    } 
} 

@Override 
public int getCount() { 
    return 4; 
} 

public Drawable getIcon(int position) 
{ 
    return context.getResources().getDrawable(icons[position]); 
} 



} 

回答

0

兩種方式1片段之間進行通信。 1)如果我知道要調用哪些片段的方法/數據,我得到片段實例並調用它。您可以通過標記通過fragmentManager的apis獲取實例。

2)如果多個片段可以響應我的方法/數據調用,我使用BroadcastReceivers。通過這種方式,您可以在每個想要偵聽的片段中註冊BR,從一個/多個片段中調用。並從特定片段發送廣播。

如果需要,詢問更多細節?

+0

是的,我知道這一點。我說有點因爲我嘗試了一次嘗試,但它似乎並沒有工作。你能否把你說的話與我發佈的我的代碼相關的簡單示例代碼聯繫起來?我仍然不知道我是否需要使用活動進行交流。謝謝:) @AAnkit – Celly

+0

你想要哪個選項的例子?如果您使用BR,則必須使用相同的意向操作來發送/接收廣播。 – AAnkit

+0

我想知道爲什麼我的輸出仍然爲空,即使當我試圖通過新實例傳遞一個文本到片段時,請。感謝您的幫助@AAnkit – Celly

0

首先,我想說,我認爲它可能不是一個好主意,兩個片段直接進行通信。部分使用Fragments的原因是它們可以成爲可重用的部分。但是讓它們中的兩個緊密結合就意味着它們不能獨立使用。

假設兩個碎片同時在屏幕上(由同一個父Activity啓動),標準模式是爲兩個碎片創建接口,爲Activity創建一個接口,並讓碎片通過活動。

也就是說,也可以使用消息總線。

看看Square的Otto或greenrobot的EventBus。

使用消息總線的好處在於,就像使用接口通過Activity進行通信一樣,總線會使片段不必知道彼此。他們都具有總線的知識,但是經過一些仔細的規劃,您可以爲總線創建接口,然後將實際的消息總線(Otto或EventBus)包裝在實現該接口的類中。

使用消息總線比使用BroadcastReceiver容易得多,並且由於它不依賴於Android SDK或庫,因此可以輕鬆地對其進行模擬/測試。

+0

所以基本上即時通訊使用直接通訊?但那麼爲什麼我沒有在system.out.print上獲得任何輸出? mparam 1和2始終爲空。我不明白爲什麼。 @GreyBeardedGeek – Celly

+0

system.out在Android上沒有任何用處。嘗試使用內置的日誌記錄工具。 – GreyBeardedGeek

相關問題