Activity与Activity,Fragment之间的数据传递方法

Activity与Activity的通信

方法一:利用intent来传值

//传值部分
Intent intent = new Intent();
intent.putExtra(key,value);
startActivity(intent);
//接收数据部分
Intent intent = this.getIntent().getExtra();
String s = intent.getString(key);

方法二:利用Bundle来传值

//传值部分
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putString(key,value);
intent.putExtras(bundle);
startActivity(intent);
//接收部分
Bundle bundle = getActivity().getIntent().getExtras();
String number = bundle.getString(key);

以上两种方法均可使用,但是一般用方法二。

方法三:传递Bitmap类,实现了Parcelable借口,所以如果想要传递Bitmap对象则可以直接传递过去

public void onClick(View view) {
        Intent intent = new Intent(this, TwoActivity.class);
        intent.putExtra("key", "value");
        Bitmap bitmap = BitmapFactory.
                decodeResource(getResources(), R.mipmap.ic_launcher);
        intent.putExtra("bitmap", bitmap);
        startActivity(intent);
    }

在第二个activity接收
((ImageView) findViewById(R.id.image))
                .setImageBitmap((Bitmap) getIntent().getParcelableExtra("bitmap"));

方法四:如果想要传递实体类,则需要该实体类实现Serializable接口

public class Student implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name= name;
    }
}

传递部分

Student student = new Student();
student setName("lily");
intent.putExtra("name",student);
startActivity(intent);

接收部分

Intent intent = getIntent();
Student student = (Student) intent.getSerializableExtra("name")

方法五:有时候我们需要在第二个Activity中做了一些操作后返回上一个Activity的时候将数据返回给上一个Activity,那么我们就需要调用(此方法在Activity与Fragment之间通信也可用)

startActivityForResult(intent,requestCode);

方法参数是Intent和requestCode
在第二个Activity中调用setResult方法返回:

private static final int resultCode = 2;
    private void back() {
        setResult(resultCode, new Intent());
        finish();
    }

并且在第一个Activity中通过重写onActivityResult方法接收数据:
requestCode是请求码,resultCode是结果码
requestCode是用来标识请求的来源; resultCode是用来标识返回的数据来自哪一个activity
关于请求码和结果码详情请参考(https://blog.csdn.net/u010542873/article/details/51219352)

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 请求码                          结果码
        if(requestCode==this.requestCode&&resultCode==TwoActivity.resultCode){
            //data就是上一个Activity调用setResult方法时传递过来的Intent
            Toast.makeText(this,data.getStringExtra("a"),Toast.LENGTH_SHORT).show();
        }
    }

Activity与Fragment之间的通信

Activity向Fragment传值
方法一:利用setArguments()方法传值
该方法只适合在Fragment开始创建的时候就要拿到数据的时候使用。

//传值部分
private Fragment fragment;
Bundle bundle = new Bundle();
bundle.putString(key,value);
fragment.setArguments(bundle);

//接收数据部分
Bundle bundle=getArguments();
String str=bundle.getString("argument");

方法二:利用Bundle传值——适用于不同的Activity与Fragment
这种方法跟两个Activity的之间的数据传递基本一致,不同的是,在向Fragment传递数据时,Main1Activity是要传递数据的Activity,而Main2Activity是Fragment所依赖的Activity,然后再在目标Fragment内接收数据。

//传值部分
Intent intent = new Intent(Main1Activity.this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putString(key,value);
intent.putExtras(bundle);
startActivity(intent);
//接收部分(在fragment里面接收)
Bundle bundle = getActivity().getIntent().getExtras();
String number = bundle.getString(key);

Fragment向Activity传值
方法一:通过getActivity()方法获取到相应的Actvivity对象,然后调用Activity中的方法。

MainActivity mainActivity = (MainActivity) getActivity();
        mainActivity.showToast("呵呵");

方法二:使用接口回调方法传递,该接口回调方法只能用在fragment与所依赖的activity之间的数据传递。

//第一步:创建一个接口
public interface Onclick{
    void OnclickListener(String s);
}
//第二步:在Fragment内声明这个接口
private Onclick oclick;
//第三步:创建修改器set方法
public void setOnclick(Onclick onclick){
    this.onclick = onclick;
}
//第四步:在合适的位置调用接口对象以及接口方法,value是要传递的数据
onclick.OnclickListener(value);
//第五步:在所依赖的Activity内的合适位置调用该接口
Activity.setOnclick(new Onclick(){
    public void OnclickListener(String s){
        }
    });

详细分析,前四个步骤都是在Fragment内完成,最后一步是在Activity内完成的,接口方法OnclickListener(String s)中s就是要传递的数据,在第四步的时候我们将要传递的数据value放在接口对象引用的方法内,然后在Activity内调用接口的时候,value就存进到public void OnclickListener(String s){}方法内的s,这个时候就可以拿到从fragment传递过来的数据了。

猜你喜欢

转载自blog.csdn.net/qq_41545435/article/details/81408789