欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-15 15:07:11
...

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传递过来的数据了。