android两个activity之间传值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android两个activity之间传值相关的知识,希望对你有一定的参考价值。

第二个Activity上有一个edittext和两个按钮,我只想把edittext里面的东西传给第一个activity,但是为什么两个按钮也会一块传过去呢?

android中activity之间传值是通过Intent来传递数据的。
Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。

传递数据的方式:
1.使用Intent转跳
Intent intent = new Intent(activity,目标Activity.class);
2.用Intent传递数据,例如:
intent.putExtra("name","张三");
注意, 这个name表示取值的key,后台是value
3.启动Activity startActivity(intent);
4.在目标Activity中获取这个值
Intent intent = getIntent();
String name = intent.getStringExtra("name");
参考技术A   Activity之间是没有办法直接传递数据的。Android的设计原则是,用Intent在不同的Activity和进程之间进行通信,但是通常来讲,Intent中只能存入基本数据类型和系统默认支持的比如Uri之类的。那么对于用户自己定义的数据结构是无法直接用Intent来传送的,如果想要通过Intent来传递自定义数据,可以让数据结构实现Parcelable接口,这样就可以把数据放入Intent。但是Intent的传送效率也不是很高,特别是当传递一些如Bitmap的大数据,用Intent传递超过500K的Bitmap,就会造成Framework层的Java Binder挂掉,结果就是传递不成功。
  这点可以算成是Android的一个弊端,没有很好的解决方案。能做到的就是尽量设计的时候注意,尽量让Activity之间共享基本数据类型。
  Android本身的应用中也深受其害,可以看到有很多应用程序的源代码中的主要的类在三千行以上的不在少数,比如Browser中的BrowserActivity有四千多行;Mms中的ComposeMessageActivity也有四千多行,等等。为什么一个类会如此之大,就是因为它们是程序的主页面,是业务的核心逻辑所在,里面也控制着很多的其他的数据结构,而又无法与另外的Activity共享,所以就只能在一个Activity里面做所的事情。
参考技术B 废话少说,看代码:
Intent intent=new Intent();
intent.setClass(SecondActivity.this,FirstActivity.class);
Bundle bundle=new Bundle();//new一个bundle对象,并将要传递的数据传入
bundle.putString("key", value);//从第二个activity传键值队给第一个activity,value为edittext里面的内容
intent.putExtras(bundle);//将bundle对象assign给intent,这样就可以实现参数传递给另一个activity
startActivity(intent);
SecondActivity.this.finish();
参考技术C ...目测是布局的问题,跟传值无关 参考技术D 你是怎么传的?能发段代码看看么?一般Activity传值都是使用Bundle来进行绑定,然后跟Intent绑定进行传值的。本回答被提问者采纳

Android Studio基础项目-两个Activity的Intent传值自定义类数据(如数据库数据读取)。

Android Studio基础项目-两个Activity的Intent传值自定义类数据(如数据库数据读取)。

接本节https://blog.csdn.net/xwbk12/article/details/116090792?spm=1001.2014.3001.5501

步骤一:创建自定义类文件

创建自定义类User.class,并把这个类文件放到model下

步骤二:在自定义类User.class数据中添加自定义的数据

步骤三:对每个自定义数据的属性、方法添加

package com.xwb.userintent.model;

public class User //在该自定义类放置自定义的部分数据
    private String name;
    private String password;
    private int age;

    public User()

    
    public User(String name,String password,int age)
        this.name = name;
        this.password = password;
        this.age = age;
    

    public String getName() 
        return name;
    

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

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

步骤四:重写toString的方法

package com.xwb.userintent.model;
/**JavaBean**/
public class User //在该自定义类放置自定义的部分数据
    private String name;
    private String password;
    private int age;

    public User()

    
    public User(String name,String password,int age)
        this.name = name;
        this.password = password;
        this.age = age;
    

    public String getName() 
        return name;
    

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

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "User" +
                "name='" + name + '\\'' +
                ", password='" + password + '\\'' +
                ", age=" + age +
                '';
    

步骤五:使用自定义类方法

package com.xwb.userintent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.renderscript.RenderScript;
import android.view.View;

import com.xwb.userintent.model.User;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity 
    public void tiaozhuan(View v)
        Intent intent = new Intent();//跳转意图
        //告诉意图,想从哪个界面跳转到哪里
        intent.setClass(MainActivity.this,MainActivity_sec.class);//跳转的源、目的

        //发送数据,java基本数据类型有8类,不支持Map类型。设置完数据后,需要到MainActivity_sec.activity中接收数据
        intent.putExtra("name","haha");
        intent.putExtra("age",20);//int型数据
        intent.putExtra("aihao",new String[]"唱歌","打游戏");

        //使用Bundle,发送数据
        Bundle bundle = new Bundle();//创建
        bundle.putInt("score",100);//设置score值为100
        bundle.putString("info","这里是Bundle传值");
        intent.putExtras(bundle);//关键处,把bundle值传给intent

        //传自定义数据,发送数据
        User user = new User("lidada","123456",40);
        intent.putExtra("user",user);

        startActivity(intent);//执行跳转
    

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

因此需要去User.java中实现序列化的接口

package com.xwb.userintent.model;

import java.io.Serializable;

/**JavaBean**/
public class User implements Serializable //在该自定义User类放置自定义的部分数据,大部分情况数据来源于自定义类,如:数据库也多用于此类
    private String name;
    private String password;
    private int age;

    public User()

    
    public User(String name,String password,int age)
        this.name = name;
        this.password = password;
        this.age = age;
    

    public String getName() 
        return name;
    

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

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "User" +
                "name='" + name + '\\'' +
                ", password='" + password + '\\'' +
                ", age=" + age +
                '';
    

步骤六:接受数据

package com.xwb.userintent;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import com.xwb.userintent.model.User;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Arrays;

public class MainActivity_sec extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sec);

        //接收MainActivity的传过来的数据值,并保存到相应值中
        Intent intent = getIntent();
        int age = intent.getIntExtra("age",0);//接收第一个int型数据,没有就使用默认值0
        int score = intent.getIntExtra("score",0);//没有使用bundle时值为0,使用后为100,bundle接受数据
        String name = intent.getStringExtra("name");
        String[] aihao = intent.getStringArrayExtra("aihao");

        //自定义类User.class接收数据
        Serializable user = (User)intent.getSerializableExtra("user");

        Log.i("MainActivity_sec",age+"  显示年龄");
        Log.i("MainActivity_sec",score+"  显示分数");
        Log.i("MainActivity_sec",name+"   显示姓名");
        Log.i("MainActivity_sec", Arrays.toString(aihao));
        Log.i("MainActivity_sec",user.toString());//打印user自定义数据
    

步骤七:运行APP

 

以上是关于android两个activity之间传值的主要内容,如果未能解决你的问题,请参考以下文章

android activity中的变量怎么传值给fragment

Android中点击按钮启动另一个Activity以及Activity之间传值

Android 两个Activity间的传值与回传值

Android Studio第二十六期 - 自定义Activity中Fragment之间的传值

android 怎么在activity之间传递List 类型的数据

Android中实现activity的页面跳转并传值