1. 程式人生 > >Fragment跳轉時傳遞引數及結果回傳的方法

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

前言:不知不覺工作已經八個月了,深感沒學到什麼東西啊,今年要努力了。但以後真的會用到android技術嗎,根本回答不了這個問題,只能說,它是一個在任何事情都不成功的情況下,保命的根本而已,但技術還是要深通的。利用這兩年時間把android搞精搞透。加油吧,少年

今天總結一下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間引數傳遞

在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(三)——自定義對話方塊檢視及引數傳遞》第三部分:引數傳遞;詳細講過,大家可以先看原始碼,如果原始碼不懂,可以參考下這篇文章,這裡就不再贅述。