上一篇說到了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。