繁体   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