如何从 Android Studio 上的多个活动传输数据?
How to transfer data from multiple activities on AndroidStudio?
我是 Android 和 java 的新手,我正在尝试开发一个需要多项活动的应用程序。
第一个activity是主菜单,第二个是闹钟,第三个是设置。
问题是我想从第一个开始第二个activity,但是我想检查密码以从第三个开始停止警报。
我查了很多教程,似乎我需要将第三个中的数据activity发送到第二个,但是我在第一个上创建第二个,我不知道如何获取"Intend" 对象发送数据,如果我创建另一个具有相同引用的对象,它会崩溃。
我试图将第二个意图从第一个发送到第三个 activity,但我不知道如何接收它,因为它既不是字符串,也不是 Int...我做不到 "bundle.getString".
如您所见,我有点困惑,这可能比我想的要容易。我会感谢你的任何回答。
第一Activity(主要):
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);
}
}
第二个Activity(警报)
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();
}
}
}
第三Activity(选项)
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
}
}
根据您需要共享的数据,您可以在活动之间发送捆绑包、使用共享首选项或实现您自己的单例 class 并在所有应用程序之间共享数据。
当我需要共享需要在应用程序的任何时候为不同的活动知道的数据时,我更喜欢这样的单例:
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";
如果您需要以离散方式从一个实例向另一个实例发送信息:
来源 activity 类似于:
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();
}
在目的地activity您需要获取接收到的数据:
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);
}
}
}
希望对您有所帮助。
你可以做到。在您的 Opciones activity 中,声明一个静态字符串变量。将 EditText 数据存储到字符串中,您可以引用第二个 activity.
中的字符串
第三个Activity
public static String claveCorrecta = "";
claveCorrecta = et2.getText.toString();
现在在第二个 Activity 中,您可以通过
引用字符串
Opciones.claveCorrecta
您可以将基本类型和 POJO
对象发送到其他活动。要发送任何 POJO
,您必须实施 Serializable
或 Parcellable
.
例如,要向第二个 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);
如果你想从第二个 activity 接收一些数据,你将不得不使用 startActiivtyForResult
而不是 startActivity
像这样:
public final static int REQUEST_CODE = 0001; // integer of your choice
startActivityForResult(intent, REQUEST_CODE);
那么你必须覆盖 activity 中调用 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.
}
}
}
例如,您希望从第二个 Activity 向第一个 Activity 发送一个布尔值。你可以这样做:
Intent intent = new Intent();
intent.putExtra("key_is_success", true);
setResult(RESULT_OK, intent);
finish();
如果您想将一些数据从 Third Activity 发送回 Second Activity 并且 Second Activity 会将其发送回 First Activity,则适用同样的逻辑.
您还可以在从第二个 Activity 启动第三个 Activity 时使用 Intent.FLAG_ACTIVITY_FORWARD_RESULT
。根据文档:
If set and this intent is being used to launch a new activity from an existing one, then the reply target of the existing activity will be transfered to the new activity. This way the new activity can call setResult(int) and have that result sent back to the reply target of the original activity.
阅读此 link 了解更多详情:
https://developer.android.com/training/basics/intents/result.html
希望对您有所帮助。干杯!
我是 Android 和 java 的新手,我正在尝试开发一个需要多项活动的应用程序。
第一个activity是主菜单,第二个是闹钟,第三个是设置。
问题是我想从第一个开始第二个activity,但是我想检查密码以从第三个开始停止警报。
我查了很多教程,似乎我需要将第三个中的数据activity发送到第二个,但是我在第一个上创建第二个,我不知道如何获取"Intend" 对象发送数据,如果我创建另一个具有相同引用的对象,它会崩溃。
我试图将第二个意图从第一个发送到第三个 activity,但我不知道如何接收它,因为它既不是字符串,也不是 Int...我做不到 "bundle.getString".
如您所见,我有点困惑,这可能比我想的要容易。我会感谢你的任何回答。
第一Activity(主要):
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);
}
}
第二个Activity(警报)
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();
}
}
}
第三Activity(选项)
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
}
}
根据您需要共享的数据,您可以在活动之间发送捆绑包、使用共享首选项或实现您自己的单例 class 并在所有应用程序之间共享数据。 当我需要共享需要在应用程序的任何时候为不同的活动知道的数据时,我更喜欢这样的单例:
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";
如果您需要以离散方式从一个实例向另一个实例发送信息:
来源 activity 类似于:
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();
}
在目的地activity您需要获取接收到的数据:
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); } }
}
希望对您有所帮助。
你可以做到。在您的 Opciones activity 中,声明一个静态字符串变量。将 EditText 数据存储到字符串中,您可以引用第二个 activity.
中的字符串第三个Activity
public static String claveCorrecta = "";
claveCorrecta = et2.getText.toString();
现在在第二个 Activity 中,您可以通过
引用字符串Opciones.claveCorrecta
您可以将基本类型和 POJO
对象发送到其他活动。要发送任何 POJO
,您必须实施 Serializable
或 Parcellable
.
例如,要向第二个 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);
如果你想从第二个 activity 接收一些数据,你将不得不使用 startActiivtyForResult
而不是 startActivity
像这样:
public final static int REQUEST_CODE = 0001; // integer of your choice
startActivityForResult(intent, REQUEST_CODE);
那么你必须覆盖 activity 中调用 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.
}
}
}
例如,您希望从第二个 Activity 向第一个 Activity 发送一个布尔值。你可以这样做:
Intent intent = new Intent();
intent.putExtra("key_is_success", true);
setResult(RESULT_OK, intent);
finish();
如果您想将一些数据从 Third Activity 发送回 Second Activity 并且 Second Activity 会将其发送回 First Activity,则适用同样的逻辑.
您还可以在从第二个 Activity 启动第三个 Activity 时使用 Intent.FLAG_ACTIVITY_FORWARD_RESULT
。根据文档:
If set and this intent is being used to launch a new activity from an existing one, then the reply target of the existing activity will be transfered to the new activity. This way the new activity can call setResult(int) and have that result sent back to the reply target of the original activity.
阅读此 link 了解更多详情: https://developer.android.com/training/basics/intents/result.html
希望对您有所帮助。干杯!