2013-12-23 66 views
1

我有1個佈局。它包含2個片段。此佈局中有2個按鈕。當我點擊按鈕1時,片段1即將顯示。我要在textview中顯示「歡迎」片段1內容的單擊按鈕,然後單擊主佈局中的按鈕2,片段2即將顯示,片段2的textview將顯示片段1的textview的內容。如何從片段發送數據到片段?

這兒,這是我的code.Please節目,給我一些意見,me.How到reslove這個問題 首先是mainlayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/btnFragment1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="fragment1" /> 

<Button 
    android:id="@+id/btnFragment2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Fragment2" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/container"> 
</LinearLayout> 

首先是fragment1.xml

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button" /> 


第一個是fragment1.java

public class Fragment1 extends Fragment{ 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
} 



@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view = null; 
    view = inflater.inflate(R.layout.fragment1, null); 
      //I will get text after I press button and using bundle for storage 
      and send send to fragment 
    return view; 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

@Override 
public void onDestroyView() { 
    // TODO Auto-generated method stub 
    super.onDestroyView(); 
} 

@Override 
public void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
} 

@Override 
public void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
} 

@Override 
public void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
}} 

首先是fragment2.xml

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button" /> 

首先是fragment2.java

public class Fragment2 extends Fragment{ 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment2, null); 
     //In this I am going to using Bundle to get message from fragment1 
}} 

首先是MainActivity.java

public class MainActivity extends FragmentActivity { 

Button btnFragment1, btnFragment2; 
FragmentManager fragmentManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    fragmentManager = getSupportFragmentManager(); 

    btnFragment1 = (Button) findViewById(R.id.btnFragment1); 
    btnFragment1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      FragmentTransaction transaction = fragmentManager.beginTransaction(); 

      transaction.replace(R.id.container, new Fragment1(), "TAG_FRAGMENT1"); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    }); 

    btnFragment2 = (Button) findViewById(R.id.btnFragment2); 
    btnFragment2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      FragmentTransaction transaction = fragmentManager.beginTransaction(); 

      transaction.replace(R.id.container, new Fragment2(), "TAG_FRAGMENT2"); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
}} 
+0

碎片不應該直接相互溝通,一個活動的肩膀d是中間人 – tyczj

+0

所以實際上,我想從片段1獲取數據到片段2.當我使用主要佈局容器2片段的主要活動使用傳輸塊時 – trannam57

回答

0

@Raghunandan有一個很好的答案爲例。儘管不是唯一的選擇,但您可以使用BroadcastManager或LocalBroadcastManager。這樣,您就可以輕鬆地跨越活動,片段,服務響應事件等

how to use LocalBroadcastManager?

0

您可以使用活動的片段之間的代理,這是如何在片段通知活動有關事件:

public class FragmentA extends Fragment { 
    OnSomethingDoneInFragmentListener mListener; 

    //this inteface must implement Activity that use the fragment 
    public interface OnSomethingDoneInFragmentListener { 
     public void onSomethingDone(Object someObject); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnSomethingDoneInFragmentListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement OnSomethingDoneInFragmentListener"); 
     } 
    } 
} 
0

嘗試使用EventBus,它爲您節省了大量工作。

EventBus是Android優化的發佈/訂閱事件總線。 Android應用程序的典型用例是將活動,碎片和 後臺線程粘合在一起。這些元件的傳統接線通常會引入複雜且容易出錯的依賴關係和生命週期問題。 EventBus通過所有參與者 (例如後臺服務 - >活動 - >多個片段或幫助程序 類)傳播偵聽器將變爲棄用。 EventBus將事件發送者和接收者分開,從而簡化了應用程序組件之間的通信。 代碼少,質量好。而且你不需要實現一個單一的 接口!

定義您的事件,這是一個數據對象:

class MyClickEvent { 
    // ... 
    public MyClickEvent(String field1, int field2) { 
     // ... 
    } 
} 

在一個片段,註冊自己來處理事件:

class MyFragment extends Fragment { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // ... 
     EventBus.getDefault().register(this, MyClickEvent.class); 
    } 

    public void onEvent(MyClickEvent event) { 
     // handle the event 
    } 
} 
按鈕點擊

事件後:

button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     EventBus.getDefault().post(new MyClickEvent("Some data", 123456)); 
    } 
}); 
相關問題