首页 > 代码库 > Android 完美解决bundle实现页面跳转并保留之前数据+传值

Android 完美解决bundle实现页面跳转并保留之前数据+传值

 

  前言:昨天碰到了一个问题,我想实现页面跳转,采用了Bundle之后,再回到原来的页面,发现数据也没有了,而且一直报错,网上查找了很多资料,发现要用一个startActivityForResult(),然而好景不长,我又想在后面的页面把后面页面的数据和前面传过来的数据都传递给中间页面的数据,这样挺起来有些复杂,我简单写了一个Demo

 

  1.首先是3个Activity=====对应3个布局=====全部贴出来好了,一看就懂的。

  对应Main3Activity

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/colorAccent"    android:orientation="vertical"    tools:context="com.example.kk.test1.Demo.Main3Activity">    <Button        android:id="@+id/main3_but1"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:text="第一个活动"        android:layout_gravity="center"        />    <TextView        android:id="@+id/main3_txt1"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第一个活动1"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main3_txt2"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第一个活动2"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main3_txt3"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第一个活动3"        android:layout_gravity="center"        android:background="@color/colorPrimary"        /></LinearLayout>

 

  对应Main4Activity

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/green"    android:orientation="vertical"    tools:context="com.example.kk.test1.Demo.Main3Activity">    <Button        android:id="@+id/main4_but1"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:text="第2个活动"        android:layout_gravity="center"        />    <TextView        android:id="@+id/main4_txt1"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第2个活动1"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main4_txt2"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第2个活动2"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main4_txt3"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第2个活动3"        android:layout_gravity="center"        android:background="@color/colorPrimary"        /></LinearLayout>

 

  对应Main5Activity

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/purple"    android:orientation="vertical"    tools:context="com.example.kk.test1.Demo.Main3Activity">    <Button        android:id="@+id/main5_but1"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:text="第3个活动"        android:layout_gravity="center"        />    <TextView        android:id="@+id/main5_txt1"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第3个活动1"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main5_txt2"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第3个活动2"        android:layout_gravity="center"        android:background="@color/colorPrimary"        />    <TextView        android:id="@+id/main5_txt3"        android:layout_height="50dp"        android:layout_width="100dp"        android:text="第3个活动3"        android:layout_gravity="center"        android:background="@color/colorPrimary"        /></LinearLayout>

 

  2.然后是3个Activity

  =====Main3Activity

package com.example.kk.test1.Demo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.example.kk.test1.R;public class Main3Activity extends AppCompatActivity {    private Button but1;    private TextView txt1;    private TextView txt2;    private TextView txt3;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        initView();        butOnClick();    }    private void initView(){        but1=(Button) findViewById(R.id.main3_but1);        txt1=(TextView)findViewById(R.id.main3_txt1);        txt2=(TextView)findViewById(R.id.main3_txt2);        txt3=(TextView)findViewById(R.id.main3_txt3);    }    private void butOnClick(){        but1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent(Main3Activity.this,Main4Activity.class);                Bundle bundle=new Bundle();                String s_txt1=txt1.getText().toString();                String s_txt2=txt1.getText().toString();                String s_txt3=txt1.getText().toString();                bundle.putString("first",s_txt1);                bundle.putString("second",s_txt2);                bundle.putString("third",s_txt3);                intent.putExtras(bundle);                startActivity(intent);            }        });    }}

 

  =====Main4Activity

package com.example.kk.test1.Demo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.example.kk.test1.R;public class Main4Activity extends AppCompatActivity {    private Button but1;    private TextView txt1;    private TextView txt2;    private TextView txt3;    private Intent intent;    private Bundle bundle;    private Bundle bundleFrom5;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main4);        initView();        intent=getIntent();        bundle=intent.getExtras();        change_txt();        butOnclick();    }    private void initView(){        but1=(Button) findViewById(R.id.main4_but1);        txt1=(TextView)findViewById(R.id.main4_txt1);        txt2=(TextView)findViewById(R.id.main4_txt2);        txt3=(TextView)findViewById(R.id.main4_txt3);    }    private void change_txt(){//从第一个页面拿来的东西        String s_txt1=bundle.getString("first");        String s_txt2=bundle.getString("second");        String s_txt3=bundle.getString("third");        txt1.setText(s_txt1);        txt2.setText(s_txt2);        txt3.setText(s_txt3);    }    private void butOnclick(){//记录跳转前第二个页面的数据        but1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent(Main4Activity.this,Main5Activity.class);                Bundle bundle2=new Bundle();                bundle2.putString("first_1",txt1.getText().toString());                bundle2.putString("first_2",txt2.getText().toString());                bundle2.putString("first_3",txt3.getText().toString());                intent.putExtras(bundle2);//这里测试一下用之前的可不可以                startActivityForResult(intent,0x717);            }        });    }    @Override    protected void onActivityResult(int requestCode,int resultCode,Intent data){        super.onActivityResult(requestCode,resultCode,data);        if(resultCode==0x717){            bundleFrom5=data.getExtras();            txt3.setText(bundleFrom5.getString("main5_txt3"));            txt1.setText(bundleFrom5.getString("first_1"));            txt2.setText(bundleFrom5.getString("first_2"));        }    }}

 

  =====Main5Activity

package com.example.kk.test1.Demo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.example.kk.test1.R;public class Main5Activity extends AppCompatActivity {    private Button but1;    private TextView txt1;    private TextView txt2;    private TextView txt3;    private Intent intent;    private Bundle bundle;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main5);        initView();        addIntent();        butOnClick();    }    private void initView(){        but1=(Button) findViewById(R.id.main5_but1);        txt1=(TextView)findViewById(R.id.main5_txt1);        txt2=(TextView)findViewById(R.id.main5_txt2);        txt3=(TextView)findViewById(R.id.main5_txt3);        intent=getIntent();        bundle=intent.getExtras();    }    private void butOnClick(){        but1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                setResult(0x717,intent);//通过别人传过来的意图反向回去                finish();            }        });    }    private void addIntent(){//把第三个中部分内容加到第二个页面传过来的bundle        bundle.putString("main5_txt3",txt3.getText().toString());        intent.putExtras(bundle);    }}

 

  3.效果预览

  =====从Main3Activity=====点击按钮=====Main4Activity=====点击按钮=====Main5Activity

技术分享  技术分享技术分享

 

  =====最后点击Main5Activity按钮=====回到Main4Activity

技术分享

  可以发现,第二个活动即保存了前面第一个活动传过来的值,也保存了第三个活动传过来的值。

 

  4.简单总结一下吧

  =====当然最重要的就是一个跳转的函数=====startActivityForResult=====它要和另外一个活动的SetResult互相配合,用一个唯一标识符整型,随便选,我用了0x717

  =====个人觉得bundle用来传数据非常方便,以前以为就是这个bundle用来传递活动之间的数据,后来我发现我太局限了

  =====真正传递数据的是意图=====intent=====它才是老大,bundle只是它传递数据的一个工具

  =====所以说,当你需要修改传递的数据时,先添加bundle,之后千万不要忘记+intent.putExtras(bundle)

 

  5.案例很简单,简单Copy一下,自己研究一下就能懂。 

  早安呐=====2017/7/15 7:56

 

  

Android 完美解决bundle实现页面跳转并保留之前数据+传值