Android 完美解決bundle實現頁面跳轉並保留之前數據+傳值


1.前言

前言:

        昨天碰到了一個問題,我想實現頁面跳轉,采用了Bundle之后,再回到原來的頁面,發現數據也沒有了,

   而且一直報錯,網上查找了很多資料,發現要用一個startActivityForResult(),然而好景不長,

   我又想在后面的頁面把后面頁面的數據和前面傳過來的數據都傳遞給中間頁面的數據,這樣聽起來有些復雜,

   我簡單寫了一個Demo。


2.第一個活動+布局

2.1.第一個活動源代碼

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 Main1Activity 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_main1);

        initView();
        butOnClick();
    }

    private void initView(){
        but1=(Button) findViewById(R.id.main1_but1);
        txt1=(TextView)findViewById(R.id.main1_txt1);
        txt2=(TextView)findViewById(R.id.main1_txt2);
        txt3=(TextView)findViewById(R.id.main1_txt3);
    }

    private void butOnClick(){
        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Main1Activity.this,Main2Activity.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);
            }
        });
    }
}
View Code

 

2.2.第一個活動布局

<?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.Main1Activity">

    <Button
        android:id="@+id/main1_but1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="第一個活動"
        android:layout_gravity="center"
        />

    <TextView
        android:id="@+id/main1_txt1"
        android:layout_height="50dp"
        android:layout_width="100dp"
        android:text="第一個活動1"
        android:layout_gravity="center"
        android:background="@color/colorPrimary"
        />

    <TextView
        android:id="@+id/main1_txt2"
        android:layout_height="50dp"
        android:layout_width="100dp"
        android:text="第一個活動2"
        android:layout_gravity="center"
        android:background="@color/colorPrimary"
        />


    <TextView
        android:id="@+id/main1_txt3"
        android:layout_height="50dp"
        android:layout_width="100dp"
        android:text="第一個活動3"
        android:layout_gravity="center"
        android:background="@color/colorPrimary"
        />

</LinearLayout>


3.第二個活動+布局

3.1.第二個活動源代碼  

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 Main2Activity extends AppCompatActivity {

    private Button but1;
    private TextView txt1;
    private TextView txt2;
    private TextView txt3;
    private Intent intent;
    private Bundle bundle;
    private Bundle bundleFrom3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();
        intent=getIntent();
        bundle=intent.getExtras();
        change_txt();
        butOnclick();
    }

    private void initView(){
        but1=(Button) findViewById(R.id.main2_but1);
        txt1=(TextView)findViewById(R.id.main2_txt1);
        txt2=(TextView)findViewById(R.id.main2_txt2);
        txt3=(TextView)findViewById(R.id.main2_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(Main2Activity.this,Main3Activity.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(bundleFrom3.getString("main3_txt3"));
            txt1.setText(bundleFrom3.getString("first_1"));
            txt2.setText(bundleFrom3.getString("first_2"));
        }
    }

}
View Code

 

3.2.第二個活動布局

<?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.Main2Activity">

    <Button
        android:id="@+id/main2_but1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="第2個活動"
        android:layout_gravity="center"
        />

    <TextView
        android:id="@+id/main2_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/main2_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/main2_txt3"
        android:layout_height="50dp"
        android:layout_width="100dp"
        android:text="第2個活動3"
        android:layout_gravity="center"
        android:background="@color/colorPrimary"
        />


</LinearLayout>


4.第三個活動+布局

4.1.第三個活動源代碼

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;
    private Intent intent;
    private Bundle bundle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        initView();
        addIntent();
        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);
        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("main3_txt3",txt3.getText().toString());
        intent.putExtras(bundle);
    }


}
View Code

 

4.2.第三個活動布局

<?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/main3_but1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="第3個活動"
        android:layout_gravity="center"
        />

    <TextView
        android:id="@+id/main3_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/main3_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/main3_txt3"
        android:layout_height="50dp"
        android:layout_width="100dp"
        android:text="第3個活動3"
        android:layout_gravity="center"
        android:background="@color/colorPrimary"
        />


</LinearLayout>


5.效果預覽

5.1.從Main1Activity==>點擊按鈕==>Main2Activity

               

 

5.2 從Main2Activity==>點擊按鈕==>Main3Activity

                 

 

5.3.從Main3Activity==>點擊按鈕==>回到Main2Activity

                   

    可以發現,第二個活動即保存了前面第一個活動傳過來的值,也保存了第三個活動傳過來的值。


6.簡單總結一下

 

6.1.當然最重要的就是一個跳轉的函數=====startActivityForResult=====它要和另外一個活動的SetResult

   互相配合,用一個唯一標識符整型,隨便選,我用了0x717。

 

6.2.個人覺得bundle用來傳數據非常方便,以前以為就是這個bundle用來傳遞活動之間的數據,后來我發現我太局限了

 

6.3.真正傳遞數據的是意圖=====intent=====它才是老大,bundle只是它傳遞數據的一個工具。

  

6.4.所以說,當你需要修改傳遞的數據時,先添加bundle,之后千萬不要忘記+intent.putExtras(bundle)。

 

6.5.案例很簡單,簡單Copy一下,自己研究一下就能懂。 

 

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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM