当前位置: 代码迷 >> Android >> Android 学习之路 1:怎么在Activity之间传递数据
  详细解决方案

Android 学习之路 1:怎么在Activity之间传递数据

热度:56   发布时间:2016-04-27 22:43:17.0
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 方法

@Overrideprotected 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;    }}

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

@Overrideprotected 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 之间就是这么传递数据的……

零点半了……睡觉……

版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

  相关解决方案