Activity的数据交互

一、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界面效果图:
AActivity界面效果图:

BActivity界面效果图:
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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值