Android 学习之路 1:如何在Activity之间传递数据

传递数据

  • 新建 Activity

在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity。

此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用。

  • 用Intent 发送数据

在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件。

    Button button;

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

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);
                i.putExtra("Thanks","Thank you for reading my blog.");
                startActivity(i);
            }
        });
    }
  • 用 Intent 接收数据

接下来再之前创建的 Activity 中同样新建一个 Intent 进行接受即可。和发送试用的 putExtra 类似,接受也可以用 getStringExtra 。当然了,正对不同的数据类型可以用不同的方法。

private TextView tv;                                 

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

    Intent i = getIntent();
    tv = (TextView)findViewById(R.id.tv);
    tv.setText(i.getStringExtra("Thanks"));
}                                                                                            

传递 Bundle 包

在两个 Activity 之间也可以用 Bundle 包来进行数据的传递,相比上一种方式,这一种可以包含更多的数据,你可以将其认为是一个集合,这也正符合“包”的概念。

  • 新建 Bundle
  • Bundle 可以嵌套 Bundle
  • 对 Intent 对象使用 putExtras 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            Bundle a = new Bundle();
            a.putString("Thanks", "Thank you for reading my blog.");
            Bundle b = new Bundle();
            b.putString("Android","Google");
            b.putString("Windows","Microsoft");
            a.putBundle("bundle",b);
            i.putExtras(a);
            startActivity(i);
        }
    });
}
  • 根据相应的 Key 值获取相应的Bundle数据
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);                                    

    Intent i = getIntent();                                                     

    Bundle a2 = i.getExtras();                                                  

    tv = (TextView)findViewById(R.id.tv);                                       

    tv.setText(String.format("%s Android属于%s,Windows属于%s",
            a2.getString("Thanks"),
            a2.getBundle("bundle").getString("Android"),
            a2.getBundle("bundle").getString("Windows")));
}                                                                               

传递自定义对象

Android 开发过程中自然少不了“类”了,那么这种数据又如何传输呢。

  • 切记:一定要执行序列化,即加上“implements Serializable”
public class Source implements Serializable{
    private int source;
    private String ID;

    public int getSource() {
        return source;
    }

    public void setSource(int source) {
        this.source = source;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public Source(String ID, int source) {
        this.source = source;
        this.ID = ID;
    }
}

相应有了前面的了解,大家都可以直接猜到如何使用了,那我就不再啰嗦了。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this,Main2Activity.class);
            i.putExtra("source",new Source("Player",1000));
            startActivity(i);
        }
    });
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);                  

    Intent i = getIntent();                                   

    Source s = (Source) i.getSerializableExtra("source");     

    tv = (TextView) findViewById(R.id.tv);                    

    tv.setText(String.format("ID是%s,得分是%d",
            s.getID(), s.getSource()));
}                                                             

从Activity返回数据

用户需要与应用进行交互,应用需要将用户输入的数据进行返回,所以……

在主 Activity 中定义 Button 和 TextView,前者用于导航至次 Activity , 后者用于显示返回的数据。

在次 Activity 中定义 Button 和 EditText,前者用于确认并返回至主 Activity,后者用于用户输入。

在次 Activity 中:

  • 同样用 Intent 传递数据
  • 用 setResult 设置返回结果
  • 最后用 finish
private Button button ;
private EditText editText;                                      

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

    editText = (EditText)findViewById(R.id.editText);
    button = (Button)findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent();
            i.putExtra("info",editText.getText().toString());
            setResult(0, i);  // 0表示成功
            finish();
        }
    });
}                                                               

在主 Activity 中:

  • 用 startActivityForResult 进行导航,并请求结果
    private Button button;
    private TextView textView;

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

        textView = (TextView)findViewById(R.id.textView);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);

                startActivityForResult(i,0);
            }
        });
    }
  • 重载 onActivityResult 方法,并通过 data 参数获取数据。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        textView.setText(data.getStringExtra("info"));
    }

好了,Activity 之间就是这么传递数据的……

零点半了……睡觉……

时间: 2024-12-03 17:24:11

Android 学习之路 1:如何在Activity之间传递数据的相关文章

关于Android Activity之间传递数据的6种方式

使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent); 第二个Activity中 // 获取意图对象 Intent intent = getIntent(); //获取传递的值 String str = intent.ge

在不同Activity之间传递数据的四种常用方法_Android

在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 1.通过Intent传递数据 2.通过静态变量(static)传递数据 3.通过剪贴板(Clipboard)传递数据 4.通过全局对象传递数据 在TransmitDataActivity.java中 package mobile.android.transmit.data; public class TransmitDataActivity extends Activity { @Override protected

在不同Activity之间传递数据的四种常用方法

在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 1.通过Intent传递数据 2.通过静态变量(static)传递数据 3.通过剪贴板(Clipboard)传递数据 4.通过全局对象传递数据 在TransmitDataActivity.java中 package mobile.android.transmit.data; public class TransmitDataActivity extends Activity { @Override protected

broadcastreceiver-利用广播在activity之间传递数据问题

问题描述 利用广播在activity之间传递数据问题 我想利用广播在activity之间传递数据(不是直接用intent传递bundle),代码如下: MainActivity: public class MainActivity extends Activity{ private Button mButton; @override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceSt

Android 学习之路一:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

Android学习笔记--使用剪切板在Activity中传值示例代码_Android

在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在Android系统中也存在此技术. 使用剪切板会用到,ClipboardManager对象,这个对用剪切板会用到,ClipboardManager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CL

Android学习笔记--使用剪切板在Activity中传值示例代码

在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在Android系统中也存在此技术. 使用剪切板会用到,ClipboardManager对象,这个对用剪切板会用到,ClipboardManager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CL

大叔也说Xamarin~Android篇~Activity之间传递数组

原文:大叔也说Xamarin~Android篇~Activity之间传递数组 我们在开发应用程序时,不可能只使用一个Layout或者一个Activity,比如你个管理系统,要求用户先登陆然后再使用,这时你至少要有两个activity吧,先登陆一个,然后成功后需要跳到别一个Activity,这就遇到了多个Activity之间传递数据的问题,这也是今天我们要说的! 先聊聊Activity 首先一个Activity都会去继承Activity类,这个类里有方法已经替我们实现,我们可以把activity看

Activity之间传递大数据问题

Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数.字符串.以及序列化的对象等.但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数据量相对来说是比较大的,那么intent能否胜任传递图片的任务呢? 首先很明显bitmap实现了Android中的Parcelable接口,可以序列化.因此理所当然能够通过intent传递,然而图片的大小有没有限制呢? Bitmap extends Objectimplements Parcelab