Fragment的使用(四)

上一篇說到了activity與fragment之間的數據互傳 , 但是是在動態加載fragment中實現的。


這一篇就說下載靜態加載fragment中怎麼樣實現數據互傳 。。


首先看下main_activity的佈局頁面:

fragment是用來靜態加載fragment用的,這個應該知道了。下面的textView和button是用來獲取和顯示fragment傳過來的值用的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment  
        android:id="@+id/fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:name="com.example.fourthfragment.MyFragment"/>
    <TextView 
        android:id="@+id/mainText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="mainActivity的TextView"
        />
	<Button 
	    android:id="@+id/mainButton"
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:text="mainActivity的button"
	    />
</LinearLayout>


再看下Fragment中對用的佈局文件:

這裏的TextView和button是用來獲取和顯示activity傳過來的值用的。

<?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" >
    <TextView 
        android:id="@+id/fragText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="FragmentText"
        />
    <Button 
        android:id="@+id/fragButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="獲取activity傳遞的數據"
        />
</LinearLayout>

在看Fragment文件:

package com.example.fourthfragment;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
/**
 * Fragment
 * @author lolli
 *
 */
public class MyFragment extends Fragment{

	//  數據
	private String data;
	//	定義控件
	private TextView textView;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.fragment, container, false);
		textView = (TextView) view.findViewById(R.id.fragText);
		Button button = (Button) view.findViewById(R.id.fragButton);
		// 點擊button獲取值
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 獲取activity傳遞的數據並設置到fragment裏面的textView中
				String text = getData();
				textView.setText(text);
			}
		});
		
		
		// 設置傳遞給activity的值
		setData("這是fragment傳送給activity的數據.....");
		return view;
	}
	/**
	 * 獲取數據
	 * @return
	 */
	public String getData() {
		return data;
	}
	/**
	 * 設置數據
	 * @param data
	 */
	public void setData(String data) {
		this.data = data;
	}
}

前面動態加載的時候我們創建了一個接口來讓activity實現並獲取數據。

這裏我們添加了一個data屬性,並給了get/set方法。這種法師感覺是簡單多了。

這裏說一下具體的實現步驟:

1. Fragment中添加data屬性,給get/set方法

2. 在MainActivity中給date的set方法中set數據,Fragment中通過get方法獲取activity中set的數據。這樣就拿到了activity傳過來的數據。

3. 在Fragment給data的set方法中set數據,Activity中通過getData拿到fragment中set的數據,這樣activity就拿到了fragment中傳過來的數據。


實現思路已經說清楚了,那就直接上代碼好了:

package com.example.fourthfragment;

import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 定義控件
	private Button button;
	private TextView textView;
	private MyFragment myFragment;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//初始化控件
		button = (Button) findViewById(R.id.mainButton);
		textView = (TextView) findViewById(R.id.mainText);
		
		// 獲取fragmentManager
		FragmentManager fragmentManager = getFragmentManager();
		// 通過fragmentManager找到fragment
		myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment);
		// 向 MyFragment中的data 設置數據
		myFragment.setData("這是activity傳送的數據 ....");
		// 點擊button接收fragment傳遞過來的值
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String date = myFragment.getData();
				textView.setText(date);
			}
		});
		
	}
}

這裏我們獲取到fragmentManager並不像動態加載那樣去打開事務,再去add方法添加fragment。

我們拿到fragmentManager,然後通過findFragmentById獲取到靜態加載的fragment,拿到後就直接操作data了。


這樣我們就實現了靜態加載fragment中的數據交互。微笑


Fragment相關的簡單介紹結束了,涉及的東西比較多,也比較不好理解,只有多思考多敲,才能機智的使用Fragment,而且發現fragment已經成爲官方主推的了,相信以後將會大量採用Fragment的方式,而不是純activity。微笑












發佈了53 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章