如何从AndroidStudio上的多个活动传输数据?

时间:2017-04-16 16:53:33

标签: java android android-intent android-activity android-studio-2.2

我是Android和Java的新手,我正在尝试开发需要多项活动的应用。

第一个活动是主菜单,第二个是闹钟,第三个是设置。

问题是我想从第一个开始第二个活动,但我想检查密码以停止第三个活动。

我检查了很多教程,似乎我需要将第三个活动中的数据发送到第二个,但是当我在第一个活动中创建第二个时,我不知道如何获得#34;打算"发送数据的对象,如果我创建另一个具有相同引用的数据,它就会崩溃。

我试图将第二次打算从第一次活动发送到第三次活动,但我不知道如何收到它,因为它既不是String,也不是......我不能做" bundle.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
    }

}

3 个答案:

答案 0 :(得分:1)

根据您需要共享的数据,您可以在活动之间发送包,使用共享首选项或使用所有应用程序之间共享的数据实现您自己的单例类。 当我需要在应用程序的任何一点分享需要知道的不同活动的数据时,我更喜欢这样的单身:

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. 从源活动开始,例如:

    private void 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. 在目的地活动中,您需要获取收到的数据:

    public void onCreate(Bundle savedInstanceState){     super.onCreate(savedInstanceState);

    getParametersFromIntent();
    

    }

    private void getParametersFromIntent(){

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

    }

  3. 希望它有所帮助。

答案 1 :(得分:0)

你可以这样做。在Opciones活动中,声明一个静态String变量。将EditText数据存储到字符串中,您可以引用第二个活动中的字符串。

第三项活动

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

现在在Second Activity中你可以通过

引用String
Opciones.claveCorrecta

答案 2 :(得分:0)

您可以将原始类型以及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);

然后,您必须在调用onActivityResult的活动中覆盖startActivityForResult方法。像这样:

@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

我希望它可以帮到你。干杯!