Как передать значения из одной активности в предыдущую деятельность
Как передать значение с одного экрана на предыдущий экран?
Рассмотрим этот случай: у меня есть два вида деятельности. На первом экране есть одна TextView
и кнопка, а вторая активность имеет один EditText
и кнопку.
Если я нажму на первую кнопку, тогда вам нужно перейти к второму действию, и здесь пользователь должен ввести что-то в текстовое поле. Если он нажмет кнопку со второго экрана, то значения из текстового поля должны перейти к первому действию и должны отображаться в первом действии TextView
.
Ответы
Ответ 1
Для захвата действий, выполняемых над одним действием в другом, требуется три шага.
Запустите вторичное действие (ваше действие "Редактировать текст") как вспомогательное действие, используя startActivityForResult
из вашего основного действия.
Intent i = new Intent(this,TextEntryActivity.class);
startActivityForResult(i, STATIC_INTEGER_VALUE);
Вместо того, чтобы просто закрывать действие, когда пользователь нажимает кнопку, в подчиненной деятельности вам нужно создать новое намерение и включить введенное текстовое значение в свой пакет дополнительных функций. Чтобы передать его родителю, вызовите setResult
перед вызовом finish
, чтобы закрыть вторичное действие.
Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();
Последний шаг заключается в вызове Activity: переопределить onActivityResult
для прослушивания обратных вызовов из текстовой записи Activity. Получите дополнительную информацию из возвращенного Намерения, чтобы получить текстовое значение, которое вы должны отображать.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (STATIC_INTEGER_VALUE) : {
if (resultCode == Activity.RESULT_OK) {
String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
// TODO Update your TextView.
}
break;
}
}
}
Ответ 2
Существует несколько способов доступа к переменным или объектам в других классах или в Activity.
а. База данных
В. общие предпочтения.
С. Сериализация объектов.
Д. Класс, который может содержать общие данные, может быть назван как Common Utilities, он зависит от вас.
Е. Передача данных через Intents и Parcelable Interface.
Это зависит от ваших потребностей проекта.
а. База данных
SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционных баз данных, такие как синтаксис SQL, транзакции и подготовленные операторы.
Учебники - http://www.vogella.com/articles/AndroidSQLite/article.html
В. Общие настройки
Предположим, вы хотите сохранить имя пользователя. Итак, теперь будет два элемента: Key Username, Значение.
Как сохранить
// Create object of SharedPreferences.
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
//now get Editor
SharedPreferences.Editor editor = sharedPref.edit();
//put your value
editor.putString("userName", "stackoverlow");
//commits your edits
editor.commit();
Используя putString(), putBoolean(), putInt(), putFloat(), putLong(), вы можете сохранить желаемый тип dtatype.
Как получить
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");
http://developer.android.com/reference/android/content/SharedPreferences.html
С. Сериализация объектов
Serlization объекта используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы также можете использовать его для своей цели.
Используйте java beans и сохраните в нем как одно из своих полей и используйте для этого геттеры и сеттеры
JavaBeans - это классы Java, обладающие свойствами. Думать о
свойства как частные переменные экземпляра. Поскольку они являются частными, единственный способ
к ним можно получить доступ извне своего класса через методы в классе.
методы, которые изменяют значение свойства, называются методами setter, а методы
которые извлекают значение свойства, называются методами getter.
public class VariableStorage implements Serializable {
private String inString ;
public String getInString() {
return inString;
}
public void setInString(String inString) {
this.inString = inString;
}
}
Задайте переменную в своем почтовом методе, используя
VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);
Затем используйте объект Serialzation для сериализации этого объекта, а в другом классе десериализуйте этот объект.
В сериализации объект может быть представлен как последовательность байтов, которая включает данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После того, как сериализованный объект был записан в файл, он может быть прочитан из файла и десериализован, то есть информация о типе и байты, которые представляют объект и его данные, могут быть использованы для воссоздания объекта в памяти.
Если вы хотите, чтобы учебник для этого ссылался на эту ссылку
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
Получить переменную в других классах
Д. CommonUtilities
Вы можете создать класс по себе, который может содержать общие данные, которые вам часто нужны в вашем проекте.
Пример
public class CommonUtilities {
public static String className = "CommonUtilities";
}
Е. Передача данных с помощью намерений
Пожалуйста, обратитесь к этому руководству для этой опции передачи данных.
http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/
Ответ 3
тебе не нужно...
Просто вызовите newIntent() из второго действия
Intent retData=new Intent();
Добавить данные для передачи обратно
putExtras (retData.putExtra("userName", getUsrName()));
Продолжайте с setResult
setResult(RESULT_OK, retData);
А потом можете закончить
finish();
Ответ 4
startActivityForResult()
А вот ссылка из SDK с дополнительной информацией:
http://developer.android.com/guide/appendix/faq/commontasks.html#opennewscreen
и прокрутите вниз до части под названием "Возвращение результата с экрана"
Ответ 5
Я часто использую статические переменные в вызывающей активности со статическими установщиками для их установки.
Таким образом, я могу изменять значения в любой активности по желанию, независимо от точного потока управления между различными видами деятельности.
Обратите внимание, что этот трюк можно использовать, только если вас не волнует
создание нескольких экземпляров одной и той же активности (класса) в приложении,
но я нашел, что это проще всего реализовать, и я использую его больше всего.
Ответ 6
Лучший способ сделать это - поместить переменную в общий класс, который определяется вне области
public class Utils
{
public static String mPosition;
}
внутри вашего кода (например, OnButtonClick и т.д.)
Intent intent = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);
внутри кода
@Override public void onActivityResult (int requestCode, int resultCode, Intent data) { if (requestCode == Keys.PICK_CONTACT) { if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData();
//you may use the variable here after intent result
LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....