今天總結一下Fragment間的參數傳遞及結果返回的方法。html
效果圖:java
一、點擊「加載第二個Fragment按鈕」,加載出第二個Fragment,同時傳遞過去參數:「從Fragment1傳來的參數」這幾個String;android
二、當用戶點擊第二個Fragment中的幾個圖片時,將點中的結果返回給第一個Fragment,將用戶的選擇在第一個Fragment顯示出來架構
首先,咱們要把整個架構搭起來,而後再進行參數傳遞和回傳ide
根據上面的效果,你們很容易看到兩個Fragment的佈局:函數
一、Fragment1的佈局:(fragment1.xml)佈局
很簡單,垂直佈局,上面一個ImageView來盛裝返回過來的圖片結果,下面一個Button來用來點擊加載第二個Fragment;spa
[java] view plain copy .net
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" code
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<ImageView
android:id="@+id/img_result"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="center"/>
<Button
android:id="@+id/load_fragment2_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="加載第二個Fragment"/>
</LinearLayout>
二、Fragment2的佈局:(fragment2.xml)
這個也是垂直佈局,上面的一個TextView用來盛裝從Fragment1傳過來的String參數,下面的幾個ImageView用來顯示幾個供用戶選擇的圖片
[html] view plain copy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is fragment 2"
android:textColor="#000000"
android:textSize="25sp" />
<ImageView
android:id="@+id/img1"
android:layout_width="100dip"
android:layout_height="100dp"
android:scaleType="center"
android:src="@drawable/animal1"/>
<ImageView
android:id="@+id/img2"
android:layout_width="100dip"
android:layout_height="100dp"
android:scaleType="center"
android:src="@drawable/animal2"/>
<ImageView
android:id="@+id/img3"
android:layout_width="100dip"
android:layout_height="100dp"
android:scaleType="center"
android:src="@drawable/animal3"/>
<ImageView
android:id="@+id/img4"
android:layout_width="100dip"
android:layout_height="100dp"
android:scaleType="center"
android:src="@drawable/animal4"/>
</LinearLayout>
一、在MainActivity初始化時,將Fragment1顯示出來:
MainActivity對應的XML文件:(main_activity.xml)
[html] view plain copy
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
對應的代碼:
[java] view plain copy
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment1 fragment1 = new Fragment1();
getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit();
}
}
二、Fragment1:在用戶點擊時,將fragment2添加到當前頁面顯示出來;
[java] view plain copy
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container, false);
Button btn = (Button)view.findViewById(R.id.load_fragment2_btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(final View view) {
Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.main_layout, fragment2);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
三、Fragment2:至於目前的它仍是很簡單的,只要能顯示出來 就行了,因此他的代碼爲:
[java] view plain copy
public class Fragment2 extends Fragment implements View.OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, container, false);
return view;
}
}
至於Fragment間參數爲何要用SetArguments來傳遞,我就不講了,看這篇文章:《Android解惑 - 爲何要用Fragment.setArguments(Bundle bundle)來傳遞參數》,我這裏只說項目中如何使用:
在Fragment2中,新建一個函數:newInstance(String text)來接收傳過來的參數:
新建一個Fragment2實例,而後將參數經過SetArguments設置到其中;
[java] view plain copy
public static Fragment2 newInstance(String text) {
Fragment2 fragment = new Fragment2();
Bundle args = new Bundle();
args.putString("param", text);
fragment.setArguments(args);
return fragment;
}
而後在Fragment2的OnCreateView的時候再從arguments中獲取參數:
[java] view plain copy
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, container, false);
if (getArguments() != null) {
String mParam1 = getArguments().getString("param");
TextView tv = (TextView)view.findViewById(R.id.textview);
tv.setText(mParam1);
}
return view;
}
在Fragment1中,在調起Fragmen2t時,經過調用newInstance函數來獲取實例並傳遞參數:
[java] view plain copy
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container, false);
Button btn = (Button)view.findViewById(R.id.load_fragment2_btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(final View view) {
Fragment2 fragment2 = Fragment2.newInstance("從Fragment1傳來的參數");
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.main_layout, fragment2);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}