![](/img/trans.png)
[英]transfer multi data from multiple activities to one activity 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";
如果您需要以离散方式将信息从一个实例发送到另一个实例:
在源活动中,如下所示:
私人无效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();
}
在目标活动中,您需要获取接收到的数据:
公共无效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
,必须实现Serializable
或Parcellable
。
例如,要将数据发送到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.