一、activity与activity的数据传递
1.activity给activity传递数据,无数据回传
1.1、AActivity传递数据给BActivity
Intent intent = new Intent(this, BActivity.class);
//传递string
intent.putExtra("data", "123456");
//传递int
intent.putExtra("age", 21);
//传递bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
intent.putExtra("bitmap", bitmap);
//传递StringArrayList
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
intent.putStringArrayListExtra("list", list);
//传递对象
Student student = new Student("张三", 21, "北京市");
intent.putExtra("student", student);
//传递一个对象集合
List<Student> students = new ArrayList<>();
students.add(student);
students.add(student);
intent.putExtra("students", (Serializable) students);
startActivity(intent);
1.2、BActivity接收AActivity传递过来的数据
Intent intent = getIntent();
String data = intent.getStringExtra("data");
int age = intent.getIntExtra("age", 0);
ArrayList<String> list = intent.getStringArrayListExtra("list");
Student student = (Student) intent.getSerializableExtra("student");
List<Student> students = (List<Student>) intent.getSerializableExtra("students");
tv_content.setText("data = " + data + "\r\n" + "age = " + age + "\r\n"
+ "list = " + list + "\r\n" + "student = " + student + "\r\n"
+ "studnets = " + students);
//接收bitmap
Bitmap bitmap = intent.getParcelableExtra("bitmap");
if (bitmap != null) {
img.setImageBitmap(bitmap);
}
1.3、 Student.java 继承Serialiable,实现可序列化
public class Student implements Serializable{
private String name;
private int age;
private String address;
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
1.4、AActivity和BActivity效果图
AActivity界面效果图:
BActivity界面效果图:
2.activity给activity传递数据,有数据回传
2.1、 AActivity传递数据给BActivity
private static final int REQ_SNED = 1;
Intent intent = new Intent(this, BActivity.class);
//传递string
intent.putExtra("data", "123456");
//传递int
intent.putExtra("age", 21);
//传递StringArrayList
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
intent.putStringArrayListExtra("list", list);
//传递对象
Student student = new Student("张三", 21, "北京市");
intent.putExtra("student", student);
//传递一个对象集合
List<Student> students = new ArrayList<>();
students.add(student);
students.add(student);
intent.putExtra("students", (Serializable) students);
startActivityForResult(intent, REQ_SNED);
2.2、 BActivity接收数据,和1.2完全相同
2.3、 BActivity回传数据给AActivity
Intent intent = new Intent();
intent.putExtra("data", "数据接收到");
setResult(RESULT_OK, intent);
finish();
2.4、 AActivity接收回传数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == REQ_SNED) {
Bundle bundle = data.getExtras();
if (bundle != null) {
String s = bundle.getString("data");
if (s != null && !s.equals("")) {
tv_content.setText(s);
}
}
}
}
}
二、activity与fragment的数据传递
1、 activity传值给fragment
1.1、 activity的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="vertical">
<Button
android:id="@+id/btn_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="传递数据" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
1.2.1、 方法1:通过 fragment.setArguments(bundle),传一个bundle来实现activity给fragment的数据传递
private DataFragment fragment;
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
fragment = new DataFragment();
Bundle bundle = new Bundle();
bundle.putString("data", "activity给fragment传递数据,123");
fragment.setArguments(bundle);
transaction.add(R.id.fragment, fragment);
transaction.commit();
1.2.2、 fragment通过getArguments()接收activity传递过来的数据
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_data, container, false);
init(view);
return view;
}
private void init(View view) {
tv_content = (TextView) view.findViewById(R.id.tv_content_fragment);
Bundle bundle = getArguments();
if (bundle != null) {
String data = bundle.getString("data");
if (data != null && !data.equals("")) {
tv_content.setText(data);
}
}
}
1.3.1、方法2:在fragment定义一个public方法,
通过该fragment的对象调用该方法来实现activity给fragment的数据传递。
如果需要传递的数据类型较多,定义方法receiveData的参数类型可以设置为Object,
通过判断接收数据类型进行分别处理receiveData(Object object)
在activity中,fragment对象调用fragment的方法来实现传递数据
fragment.receiveData("activity给fragment传递数据,你好");
1.3.2、 fragment接收activity传递数据
//receiveData是fragment中定义的一个方法
public void receiveData(String data) {
if (data != null && !data.equals("")) {
tv_content.setText(data);
}
}
1.4.1 方法3:通过接口回调实现actvity与fragment的数据传递
定义一个接口:DataCallback
public interface DataCallback {
void getData(Object object);
}
activity传递数据给fragment,activity代码
private DataCallback dataCallback;
public void setDataCallback(DataCallback dataCallback) {
this.dataCallback = dataCallback;
}
//传递数据
if(dataCallback!=null){
dataCallback.getData("activity给fragment传递数据,我们都很好");
}
1.4.2、 fragment接收actvity传递的数据
public class DataFragment extends Fragment implements DataCallback {
private TextView tv_content;
private DataActivity activity;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_data, container, false);
init(view);
return view;
}
private void init(View view) {
tv_content = (TextView) view.findViewById(R.id.tv_content_fragment);
Activity activity = getActivity();
if(activity instanceof DataActivity){
DataActivity dataActivity = (DataActivity) activity;
dataActivity.setDataCallback(this);
}
}
//接收数据
@Override
public void getData(Object object) {
if (object != null) {
if (object instanceof String) {
String data = (String) object;
if (data != null) {
tv_content.setText(data);
}
}
}
}
}
三、fragment与activity的数据传递
fragment给activity传递数据和actvity给fragment传递数据类似,
也可通过在activity中定义一个public方法,调用该方法实现数据传递,
或通过接口回调实现fragment给activity传递数据。
1、 方法1:activity定义一个public方法,通过调用该方法实现
fragment给activity传递数据
private DataActivity activity;
调用activity方法:
Activity a = getActivity();
if (a instanceof DataActivity) {
activity = (DataActivity) a;
activity.receiveData("fragment给activity传值:你好");
}
2、 方法2:通过接口回调实现fragment给activity传递数据
fragement代码:
private DataCallback dataCallback;
public void setDataCallback(DataCallback dataCallback) {
this.dataCallback = dataCallback;
}
//传递数据
if (dataCallback != null) {
dataCallback.getData("fragment给activity传值:我们都很好");
}
activity代码:
private DataFragment fragment;
fragment.setDataCallback(this);
@Override
public void getData(Object object) {
if(object!=null){
if(object instanceof String){
String ret = (String) object;
if (ret != null) {
tv_content.setText(ret);
}
}
}
}
四、fragment与fragment的数据传递
fragment与fragement不能直接进行数据传递,但是可以通过activity来实现数据的传递。
fragement把数据传给activity,然后activity把数据传给B fragement。
从而实现了fragment与fragment的数据传递。实现于上类似,就不再累述。
不足之处,希望能够给予批评和指正。谢谢!
shizyzh@163.com