总结:无论是activity给fragment传递数据,还是fragment给activity传递数据,都把activity和fragment都当做一个普通的对象,调用它的方法,传递参数。
1.Fragment中通过getActivity()然后进行强制转化,调用Activity中的公有方法
((XXXXActivity)getActivity()).fun();
2.Activity在切换Fragment的时候,通过setArguments向Fragment传递参数,Fragment通过getArguments();获得从activity中传递过来的值
实例界面:(此Demo演示了activity给fragment传递数据和fragment给activity传递数据)
代码如下:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="120dip"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity界面"
android:textSize="18sp" />
<Button
android:layout_width="120dip"
android:layout_height="wrap_content"
android:onClick="open01"
android:text="fragment01" />
<EditText
android:id="@+id/et_data"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:hint="请输入数据" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="submit"
android:text="提交" />
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="#ff000f" />
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
----------------------------------------------------------------------------------------------------------------
f01.xml
<?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:background="#00ffff"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Frgment01界面"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp" />
<EditText
android:id="@+id/et_info"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:hint="请输入信息" />
<Button
android:id="@+id/btn_info"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:text="传递" />
</LinearLayout>
------------------------------------------------------------------------------------------------------
MainActivity.java
package com.example.fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends FragmentActivity {
private Fragment01 f01;
private FragmentManager fm;
private EditText et_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_data = (EditText) findViewById(R.id.et_data);
f01 = new Fragment01();
// 得到fragment的管理器,可以得到fragment的事务管理器
fm = this.getSupportFragmentManager();
open01(null);
}
public void open01(View view) {
// Fragment01 f01= new Fragment01();
// 得到fragment的事务管理器,可以填充fragment的界面
// 事务可以保证加载的多个fragment要么同时显示成功要么同时显示失败
FragmentTransaction ft = fm.beginTransaction();
// 把f01显示在framelayout界面中
ft.replace(R.id.fl_container, f01);
// 提交事务
ft.commit();
}
// Activity传递数据给fragment
public void submit(View v) {
// 传递数据给fragment01界面
String data = et_data.getText().toString().trim();
// 把data传给fragment01
// 把fragment01作为一个普通的对象,调用它的方法传递参数
// Fragment01 f01 = new Fragment01();
// activity中设置数据,对应fragment有获取数据的方法。
f01.setData(data);
}
// 获取fragment传递过来的数据。
public void setInfo(String info) {
et_data.setText(info);
}
}
-----------------------------------------------------------------------------------------------
fragment01.xml
package com.example.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment01 extends Fragment {
private View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 加载布局文件
// getActivity() fragment所运行在的activity
// resource fragment的布局文件资源ID
// root 父级控件,通常使用null
view = View.inflate(getActivity(), R.layout.f01, null);
// 从view中找到按钮
Button btn_info = (Button) view.findViewById(R.id.btn_info);
btn_info.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText et_info = (EditText) view.findViewById(R.id.et_info);
String info = et_info.getText().toString().trim();
// 把MainActivity作为一个普通的对象,调用它的方法传递参数
FragmentActivity activity = getActivity();
// 判断activity是否是MainActivity类型的
if (activity instanceof MainActivity) {
MainActivity mainActivity = (MainActivity) activity;
// 调用activity的方法传递参数
mainActivity.setInfo(info);
}
}
});
return view;
}
// fragment传递数据给activity
public void setData(String data) {
TextView tv_data = (TextView) view.findViewById(R.id.tv_data);
tv_data.setText(data);
}
}