安卓開發-intent在Activity之間數據傳遞


看排版更好的原文地址

intent實現普通跳轉

使用intent的setclass方法,示例(由此界面跳轉到NewActivity界面)

		//使用setOnClickListener方法設置點擊事件
		Button button=(Button)findViewById(R.id.mainButton);
		button.setOnClickListener(new OnClickListener()
			{

				@Override
				public void onClick(View p1)
				{
					Intent intent=new Intent();
					intent.setClass(MainActivity.this,NewActivity.class);
					//新建一個Intent,使用setClass方法設置跳轉的哪個界面
					startActivity(intent);
				}
				
			
		});

使用Bundle傳遞數據的跳轉

Bundle類

Bundle類用來攜帶數據,類似於map。里面存放鍵值對。Bundle類有putXXX()/getXXX()方法,如putInt(),getInt(),putString(),getString().

putXXX()用來往Bundle對象存入數據。

getXXX()用來從Bundle對象取出數據。

其內部使用了HashMap<String,Object>類型的變量存儲數據。

示例

如下代碼實現將數據從當前Activity傳遞到另一個Activity:

(當前Activity)

        Button button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle data=new Bundle();
                //創建了一個Bundle對象用來存儲在兩個Activity之間傳遞的數據
                data.putString("website","cnblogs.com/hjw1");
                data.putString("name","環家偉");
                data.putInt("age",20);
                //添加進Bundle對象里面兩個String類型的數據和一個int類型的數據
                Intent gotoAnother=new Intent(MainActivity.this,Main2Activity.class);
                //創建了一個從MainActivity跳轉到Main2Activity的Intent
                gotoAnother.putExtras(data);
                //將存儲了數據的Bundle對象put進Intent里面
                startActivity(gotoAnother);
                //開始跳轉
            }
        });

(目標Activity)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Bundle receive=getIntent().getExtras();
        //得到隨Intent傳遞過來的Bundle對象
        String name=receive.getString("name");
        String website=receive.getString("website");
        int age=receive.getInt("age");
        //根據設定的String關鍵詞得到對應的數據。
        ((TextView)findViewById(R.id.name)).setText("姓名:"+name);
        ((TextView)findViewById(R.id.age)).setText("年齡:"+age);
        ((TextView)findViewById(R.id.website)).setText("博客地址:"+website);
        //將數據顯示到TextView上面
    }

結果:

姓名:環家偉
年齡:20
博客地址:cnblogs.com/hjw1

直接使用Intent傳遞數據

Intent自身也有一系列的putExtra()函數。( 這里與上面的putExtras()函數區分開,這里沒有s )
這個函數有很多重載,如putExtra(String name,String value),putExtra(String name,int value)等。
與上面的Bundle類操作方法相似,都是String-value鍵值對。
接收時,Intent對象有getXXXExtra()一系列函數得到傳遞過來的數據,如getStringExtra()等。

示例:

(當前Activity)

                Intent gotoAnother=new Intent(MainActivity.this,Main2Activity.class);
                //創建了一個從MainActivity跳轉到Main2Activity的Intent
                gotoAnother.putExtra("name","環家偉");
                gotoAnother.putExtra("age",20);
                gotoAnother.putExtra("website","cnblogs.com/hjw1");
                //將數據put進Intent里面
                startActivity(gotoAnother);
                //開始跳轉

(目標Activity)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent receiveIntent=getIntent();
        //得到Intent
        String name=receiveIntent.getStringExtra("name");
        int age=receiveIntent.getIntExtra("age",0);
        String website=receiveIntent.getStringExtra("website");
        ((TextView)findViewById(R.id.name)).setText("姓名:"+name);
        ((TextView)findViewById(R.id.age)).setText("年齡:"+age);
        ((TextView)findViewById(R.id.website)).setText("博客地址:"+website);
        //將數據顯示到TextView上面
    }

結果:

姓名:環家偉
年齡:20
博客地址:cnblogs.com/hjw1

得到新Activity關閉后的數據

想象一下,你要做一個圖像處理的app。你在當前actuvity點擊了一個按鈕,然后出現圖片列表,選擇圖片后原activity要得到圖片。這種情況在Windows里面經常出現,點擊按鈕打開文件管理器選擇文件。

要想得到新Activity關閉后傳過來的數據,只要在打開新Activity的跳轉時使用startActivityForResult(Intent intent,int requestCode) 函數,而不是以前的startActivity()函數。

這樣打開的Activity在關閉后會傳回數據。

為了得到傳回的數據,需要在前面的Activity里面重寫onActivityResult(int requestCode,int resultCode,Intent data)函數。

示例

實現點擊按鈕得到字符串時,打開新界面,點擊按鈕關閉新界面后,Toast顯示環家偉

而點擊按鈕得到整數時,Toast內容為20

        Button stringButton=(Button)findViewById(R.id.stringButton);
        stringButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent gotoAnother=new Intent(MainActivity.this,Main2Activity.class);
                startActivityForResult(gotoAnother,1);
                //第二個參數是請求碼,比如此Activity有兩個按鈕都是啟動同一個新Activity
                //請求碼就是用來區分到底是哪個按鈕請求的
            }
        });
        Button intButton=(Button)findViewById(R.id.intButton);
        intButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent gotoAnother=new Intent(MainActivity.this,Main2Activity.class);
                startActivityForResult(gotoAnother,2);
                //此處請求碼是2
            }
        });

重寫onActivityResult方法用來接收傳過來的信息

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==1)
            Toast.makeText(this,"按鈕1得到字符串:"+data.getStringExtra("name"),Toast.LENGTH_SHORT).show();
        if(requestCode==2)
            Toast.makeText(this,"按鈕2得到整數:"+data.getIntExtra("age",0),Toast.LENGTH_SHORT).show();
        //此處的requestCode就是startActivityForResult里面傳遞的requestCode
        // 可以用來區分是哪個按鈕請求的
        /*
        提示:Toast不要忘記show()
         */
    }

新Activity中

        Button closeButton=(Button)findViewById(R.id.close);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();//數據通過Intent返回
                intent.putExtra("name","環家偉");
                intent.putExtra("age",20);
                Main2Activity.this.setResult(RESULT_OK,intent);
                //RESULT_OK是一個整數,此參數是結果碼,可以用來區分是哪個Activity返回的數據
                //(如果原Activity可以打開多個新Activity)
                finish();//關閉新Activity
            }
        });


免責聲明!

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



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