簡體   English   中英

如何從AndroidStudio上的多個活動傳輸數據?

[英]How to transfer data from multiple activities on AndroidStudio?

我是Android和Java的新手,我正在嘗試開發需要多項活動的應用程序。

第一個活動是主菜單,第二個活動是警報,第三個活動用於設置。

問題是我想從第一個活動開始第二個活動,但是我想檢查密碼以停止第三個活動的警報。

我已經檢查了許多教程,似乎我需要將第三個活動中的數據發送到第二個活動,但是當我在第一個活動中創建第二個活動時,我不知道如何獲取該“ Intend”對象來發送數據,並且如果我創建另一個引用相同的引用,則會崩潰。

我已經嘗試將第二個意圖從第一個活動發送到第三個活動,但是我不知道如何接收它,因為它既不是String也不是Int,而且我不能做“捆綁銷售”。 getString”。

如您所見,我有點困惑,它可能比我想的要容易。 我將感謝您的任何答復。

第一次活動(主要):

package com.example.robert.savemob;

import android.support.v7.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class Main extends AppCompatActivity {

    Intent i1;
    Intent i2;

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

        i1 = new Intent(this, Alarma.class );
        i2 = new Intent(this, Opciones.class);
    }

    public void Alarm(View view) {
        startActivity(i1);
    }
    public void Settings(View view) {
        startActivity(i2);
    }
}

第二次活動(Alarma)

package com.example.robert.savemob;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class Alarma extends AppCompatActivity {

    private EditText et1;
    String clavecorrecta;

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

        et1=(EditText)findViewById(R.id.et1);
        Bundle bundle = getIntent().getExtras();
        clavecorrecta = bundle.getString("clavecorrecta");
    }

    public void Parar(View v) {
        String clave=et1.getText().toString();
        if (clave.length()==0) {
            Toast notificacion= Toast.makeText(this,"Introduce la clave", Toast.LENGTH_LONG);
            notificacion.show();
        }
        else if (clave.equals(clavecorrecta)) {
            finish();
        }
        else {
            Toast notificacion= Toast.makeText(this,"Clave incorrecta", Toast.LENGTH_LONG);
            notificacion.show();
        }
    }
}

第三次活動(Opciones)

package com.example.robert.savemob;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;

public class Opciones extends AppCompatActivity {

    private EditText et2;

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

        et2=(EditText)findViewById(R.id.et2);

        i1.putExtra("clavecorrecta", et2.getText().toString()); //I want to send it but can't acces to that i1
    }

}

根據需要共享的數據,您可以在活動之間發送捆綁包,使用共享的首選項,或者使用所有應用程序之間共享的數據來實現自己的單例類。 當我需要共享需要在應用程序的任何位置進行不同活動的數據時,我更喜歡這樣的單例:

public class AppData {

    private static AppData ourInstance = new AppData ();

    private String deviceId = null; //  Device
    private String coupon = null;   //  Coupon used to chack a valid event



    public static AppData getInstance () {
        return ourInstance;
    }

}

和使用像:

AppData.getInstance().deviceId = "sample device Id";

如果您需要以離散方式將信息從一個實例發送到另一個實例:

  1. 在源活動中,如下所示:

    私人無效switchToLoginActivity(int errorCode){Intent intent = new Intent(this,LoginActivity.class);

     Bundle bundle = new Bundle(); bundle.putInt (Commons.LOGIN_SHOW_MESSAGE, errorCode); intent.putExtras(bundle); startActivity(intent); overridePendingTransition(R.anim.left_to_right_in, R.anim.left_to_right_out); finish(); 

    }

  2. 在目標活動中,您需要獲取接收到的數據:

    公共無效onCreate(捆綁保存的InstanceState){super.onCreate(savedInstanceState);

     getParametersFromIntent(); 

    }

    私人void getParametersFromIntent(){

     Bundle bundle = getIntent().getExtras(); if (bundle != null) { if (bundle.containsKey(Commons.LOGIN_SHOW_MESSAGE)) { showMessage = bundle.getInt (Commons.LOGIN_SHOW_MESSAGE); } } 

    }

希望能幫助到你。

你可以這樣做。 在您的Opciones活動中,聲明一個靜態String變量。 將EditText數據存儲到字符串中,然后可以從第二個活動中引用該字符串。

第三活動

public static String claveCorrecta = "";
claveCorrecta = et2.getText.toString();

現在,在第二個活動中,您可以通過以下方式引用字符串

Opciones.claveCorrecta

您可以將基本類型以及POJO對象發送到其他活動。 要發送任何POJO ,必須實現SerializableParcellable

例如,要將數據發送到Second Activity,請執行以下操作:

    Intent intent = new Intent(context, SingleFragmentHostActivity.class);
    Bundle extras = new Bundle();
    extras.putString("key_title", "Title");
    extras.putSerializable("pojo", new Car()); // Car class must implemente Serializable
    intent.putExtras(extras);
    startActivity(intent);

如果要從第二個活動中獲取一些數據,則必須使用startActiivtyForResult而不是startActivity如下所示:

   public final static int REQUEST_CODE = 0001; // integer of your choice

   startActivityForResult(intent, REQUEST_CODE);

然后,您必須在名為startActivityForResult的活動中重寫onActivityResult方法。 像這樣:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE) {
        if(resultCode == RESULT_OK) {
            if(data != null && data.getExtras() != null) {      
                data.getExtras().getBoolean("key_is_success", false)
            }
        } else if(resultCoee == RESULT_CANEL){
           // Your logic in case user cancelled the operation or something.
        }
    }
}

例如,您要從“第二個活動”中將一個布爾值發送回“第一個活動”。 您可以執行以下操作:

    Intent intent = new Intent();
    intent.putExtra("key_is_success", true);
    setResult(RESULT_OK, intent);
    finish();

如果要將某些數據從“第三活動”發送回“第二活動”,並且“第二活動”會將其發送回“第一活動”,則采用相同的邏輯。

從“第二個活動”啟動第三個活動時,也可以使用Intent.FLAG_ACTIVITY_FORWARD_RESULT 根據文檔:

如果已設置並且此意圖已用於從現有活動啟動新活動,則現有活動的回復目標將轉移到新活動。 這樣,新活動可以調用setResult(int)並將結果發送回原始活動的回復目標。

閱讀此鏈接以獲取更多詳細信息: https : //developer.android.com/training/basics/intents/result.html

希望對您有所幫助。 干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM