Fragment跳轉時傳遞引數及結果回傳的方法(推)

NO IMAGE

今天總結一下Fragment間的引數傳遞及結果返回的方法。

效果圖:

1、點選“載入第二個Fragment按鈕”,載入出第二個Fragment,同時傳遞過去引數:“從Fragment1傳來的引數”這幾個String;

2、當使用者點選第二個Fragment中的幾個圖片時,將點中的結果返回給第一個Fragment,將使用者的選擇在第一個Fragment顯示出來

一、基本架構搭建

首先,我們要把整個架構搭起來,然後再進行引數傳遞和回傳

(一)、基本XML構建:

根據上面的效果,大家很容易看到兩個Fragment的佈局:

1、Fragment1的佈局:(fragment1.xml)

很簡單,垂直佈局,上面一個ImageView來盛裝返回過來的圖片結果,下面一個Button來用來點選載入第二個Fragment;


<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"> 
<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> 

2、Fragment2的佈局:(fragment2.xml)

這個也是垂直佈局,上面的一個TextView用來盛裝從Fragment1傳過來的String引數,下面的幾個ImageView用來顯示幾個供使用者選擇的圖片


<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> 

(二)對應的Fragment類

1、在MainActivity初始化時,將Fragment1顯示出來:

MainActivity對應的XML檔案:(main_activity.xml)


<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> 

對應的程式碼:


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(); 
} 
} 

2、Fragment1:在使用者點選時,將fragment2新增到當前頁面顯示出來;


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; 
} 
} 

3、Fragment2:至於目前的它還是很簡單的,只要能顯示出來 就好了,所以他的程式碼為:


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間引數傳遞

至於Fragment間引數為什麼要用SetArguments來傳遞,我就不講了,看這篇文章:《Android解惑 – 為什麼要用Fragment.setArguments(Bundle bundle)來傳遞引數》,我這裡只說專案中如何使用:

在Fragment2中,新建一個函式:newInstance(String  text)來接收傳過來的引數:

新建一個Fragment2例項,然後將引數通過SetArguments設定到其中;


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中獲取引數:


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函式來獲取例項並傳遞引數:


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; 
} 
} 

(三)、從Fragment2向Fragment1回傳引數

這裡只有利用回撥,有關回撥傳遞引數的問題,我在前一篇文章中:《詳解Dialog(三)——自定義對話方塊檢視及引數傳遞》第三部分:引數傳遞;詳細講過,大家可以先看原始碼,如果原始碼不懂,可以參考下這篇文章,這裡就不再贅述。

您可能感興趣的文章:

Android中給fragment寫入引數的輕量開發包FragmentArgs簡介