2014-07-24 43 views
2

我正在使用ViewPager的應用程序中工作。我第一次使用標籤,但是當我對ViewPager進行更改時,我開始對從Activity到片段的數據傳輸產生問題。用於多種意圖的LocalBroadcastManager

我終於找到了this post這個問題的解釋,並建議在使用ViewPager時使用LocalBroadcastManager從Activity發送數據到Frament。我已經實現這個代碼,並能正常工作:

Fragment1.java

現在
public class Fragment1 extends Fragment { 

    public static final String ACTION_INTENT = "fragment1.action.BOX_UPDATE"; 

    /*Register the receiver*/ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     IntentFilter filter = new IntentFilter(ACTION_INTENT); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(ActivityDataReceiver, filter); 
    } 

    /*Broadcast Receiver*/ 
    protected BroadcastReceiver ActivityDataReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(ACTION_INTENT.equals(intent.getAction())) { 
       String text = intent.getStringExtra("TEXT"); 
       witeOnBox(text); 
      } 
     } 
    }; 

    /*Method which changes the text with the icoming value*/ 
    public void witeOnBox(String text) { 
     tv_log.setText(text); 

    } 

    /*Unregister receiver*/ 
    @Override 
    public void onDestroy() { 
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(ActivityDataReceiver); 
     super.onDestroy(); 
    } 

,在MainActivity我的數據這種方式發送到片段:

protected void sendValueToFragment1(String text) { 
    Intent intent = new Intent("fragment1.action.BOX_UPDATE"); 
    intent.putExtra("TEXT", text); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

現在我需要其他發從MainActivity的數據到相同的Fragment1,我的問題是,我如何在片段中管理另一個意圖的傳入?

我是否必須創建另一個BroadcastReceiver來管理新的Intent,還是可以在同一個BroadcastRecevier中管理新的意圖?我發現我可以在BroadcastReceiver的onReceive()方法中使用if來檢查傳入的意圖過濾器,但是如果我在同一個片段中聲明瞭兩個不同的意向過濾器,我如何將它們分配給BroadcastReceiver?

回答

13

我終於解決了增加一個動作先前定義的IntentFilter:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    IntentFilter filter = new IntentFilter(ACTION_INTENT); 
    filter.addAction(ACTION_INTENT2); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(ActivityDataReceiver, filter); 
} 

然後在廣播接收器我管理的傳入操作:

protected BroadcastReceiver ActivityDataReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(ACTION_INTENT.equals(intent.getAction())) { 
      //Do 
     } 
     if(ACTION_INTENT2.equals(intent.getAction())) { 
      //DO 
     } 
    } 
}; 
-1

比使用廣播接收器更好的方法,

Fragment frag = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + mPager.getCurrentItem()); 
      if(frag!=null && mPager.getCurrentItem()==1){ 
       ((Fragment1) frag).setText(text); 
      } 

如果您導航到在此之後被稱爲片段你可以把它收到使用getActivity活動的變量();

+0

這就是我的方式是這樣做執行LocalBroadcastManager前,它不工作。正如gunar在鏈接文章中所說的那樣:「您無法直接訪問位於ViewPager中的碎片,因此您無法直接引用它們。」 – masmic

+0

好吧我沒有看到這一點。關於你的問題,那麼你應該使用相同的廣播接收機,你應該改變標籤。然後檢查Fragment中的TAG以調用不同的方法。 – johng