Отправка данных обратно в главную активность на Android
У меня есть два вида деятельности: основная деятельность и детская активность.
Когда я нажимаю кнопку в основном действии, запускается дочерняя активность.
Теперь я хочу отправить некоторые данные обратно на главный экран. Я использовал класс Bundle, но он не работает. Он выдает некоторые исключения во время выполнения.
Есть ли какое-либо решение для этого?
Ответы
Ответ 1
Есть несколько способов добиться того, чего вы хотите, в зависимости от обстоятельств.
Наиболее распространенный сценарий (как это звучит) - это когда дочерняя активность используется для ввода пользователя - например, для выбора контакта из списка или ввода данных в диалоговом окне. В этом случае вы должны использовать startActivityForResult
для запуска своей дочерней операции.
Это обеспечивает конвейер для отправки данных обратно в основное действие, используя setResult
. Метод setResult принимает значение результата int и Intent, которые передаются обратно вызывающему Activity.
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
Чтобы получить доступ к возвращенным данным в вызывающем переопределении активности onActivityResult
. Код Request соответствует целому числу, переданному в вызове startActivityForResult
, тогда как resultCode и Intent данных возвращаются из дочернего Activity.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (MY_CHILD_ACTIVITY) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
Ответ 2
Деятельность 1 использует startActivityForResult:
startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
Активность 2 запущена, и вы можете выполнить операцию, чтобы закрыть Активность, сделайте следующее:
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
Упражнение 1 - возврат из предыдущего занятия вызовет onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
num1 = data.getIntExtra(Number1Code);
num2 = data.getIntExtra(Number2Code);
}
}
ОБНОВЛЕНИЕ: Ответ на комментарий Seenu69, Во втором задании
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
Затем в первом упражнении
int result = data.getExtra(KEY_RESULT);
Ответ 3
Отправка данных назад
Это помогает мне видеть вещи в контексте. Вот полный простой проект для отправки данных обратно. Вместо того, чтобы предоставлять файлы макета XML, здесь изображение.
![enter image description here]()
Основная деятельность
- Запустите второе действие с
startActivityForResult
, предоставив ему произвольный код результата. - Переопределить
onActivityResult
. Это называется, когда заканчивается второе задание. Вы можете убедиться, что это фактически Второе действие, проверив код запроса. (Это полезно, когда вы запускаете несколько разных действий из одного и того же основного действия.) - Извлеките данные, которые вы получили из возврата
Intent
. Данные извлекаются с использованием пары ключ-значение.
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Get String data from Intent
String returnString = data.getStringExtra("keyName");
// Set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
Второе занятие
- Поместите данные, которые вы хотите отправить обратно в предыдущее действие, в
Intent
. Данные хранятся в Intent
с использованием пары ключ-значение. - Установите результат
RESULT_OK
и добавьте намерение, содержащее ваши данные. - Вызовите
finish()
чтобы закрыть второе действие.
SecondActivity.java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// Get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// Put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
Другие заметки
- Если вы находитесь во фрагменте, он не будет знать значение
RESULT_OK
. Просто используйте полное имя: Activity.RESULT_OK
.
Смотрите также
Ответ 4
FirstActivity использует startActivityForResult:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
По вызову SecondActivity setResult() по событиям onClick или по onBackPressed()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);
Ответ 5
Вызвать действие дочерней активности с использованием метода метода startActivityForResult()
Вот пример этого:
http://developer.android.com/training/notepad/notepad-ex2.html
и в разделе "Возврат результата с экрана":
http://developer.android.com/guide/faq/commontasks.html#opennewscreen
Ответ 6
Я создал простой демонстрационный класс для вашего удобства.
FirstActivity.java
public class FirstActivity extends AppCompatActivity {
private static final String TAG = FirstActivity.class.getSimpleName();
private static final int REQUEST_CODE = 101;
private Button btnMoveToNextScreen;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(mIntent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUEST_CODE && data !=null) {
String strMessage = data.getStringExtra("keyName");
Log.i(TAG, "onActivityResult: message >>" + strMessage);
}
}
}
}
А вот и SecondActivity.java
public class SecondActivity extends AppCompatActivity {
private static final String TAG = SecondActivity.class.getSimpleName();
private Button btnMoveToPrevious;
private EditText editText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editText = (EditText) findViewById(R.id.editText);
btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getEditableText().toString();
Intent mIntent = new Intent();
mIntent.putExtra("keyName", message);
setResult(RESULT_OK, mIntent);
finish();
}
});
}
}
Ответ 7
В первом упражнении вы можете отправить намерение с помощью startActivityForResult()
а затем получить результат второго setResult
после того, как оно закончилось с помощью setResult
.
MainActivity.class
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_RESULT_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
// send intent for result
startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
if (resultCode == RESULT_OK) {
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
SecondActivity.class
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
Ответ 8
Используйте sharedPreferences и сохраните свои данные и получите доступ к ним из любого места приложения
сохранить дату, подобную этому
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
И получим такие данные
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String savedPref = sharedPreferences.getString(key, "");
mOutputView.setText(savedPref);
Ответ 9
Есть несколько способов сделать это.
1. используя startActivityForResult(), который очень хорошо объяснен в приведенных выше ответах.
-
создав статические переменные в вашем классе "Utils" или любом другом вашем классе. Например, я хочу передать studentId из ActivityB в ActivityA. Сначала моя ActivityA вызывает ActivityB. Затем внутри ActivityB установите studentId (который является статическим полем в Utils.class).
Подобно этому Utils.STUDENT_ID = "1234"; затем, возвращаясь к ActivityA, используйте studentId, который хранится в Utils.STUDENT_ID.
-
создав метод getter и setter в вашем классе приложений.
вот так:
public class MyApplication extends Application {
private static MyApplication instance = null;
private String studentId="";
public static MyApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public void setStudentId(String studentID){
this.studentId=studentID;
}
public String getStudentId(){
return this.studentId;
}
}
чтобы вы закончили. просто установите данные внутри, когда u находятся в ActivityB и после возврата к ActivityA, получите данные.
Ответ 10
Все эти ответы объясняют, что сценарий вашего второго действия должен быть завершен после отправки данных.
Но в случае, если вы не хотите завершать второе действие и хотите отправить данные обратно сначала, для этого вы можете использовать BroadCastReceiver.
Во втором занятии -
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
Во-первых Activity-
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
Зарегистрировать получателя в onCreate() -
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
Отмените регистрацию в onDestroy()
Ответ 11
Просто маленькая деталь, которая, я думаю, отсутствует в ответах выше.
Если ваша дочерняя активность может быть открыта из нескольких родительских действий, вы можете проверить, нужно ли вам делать setResult
или нет, основываясь на том, была ли ваша активность открыта startActivity
или startActivityForResult
. Вы можете достичь этого с помощью getCallingActivity()
. Больше информации здесь.