Как передать значения из одного действия в предыдущее действие
-
13-09-2019 - |
Вопрос
Как мне передать значение с одного экрана на его предыдущий экран?
Рассмотрим этот случай:У меня есть два занятия.На первом экране есть один TextView
и кнопка, и второе действие имеет один EditText
и пуговица.
Если я нажму первую кнопку, то она должна перейти ко второму действию, и здесь пользователь должен ввести что-то в текстовое поле.Если он нажмет кнопку со второго экрана, то значения из текстового поля должны переместиться в первое действие, и это должно быть отображено в первом действии TextView
.
Решение
Для фиксации действий, выполняемых в рамках одного вида деятельности в рамках другого, требуется три шага.
Запустите дополнительное действие (ваше действие "Редактировать текст") в качестве подактивности, используя 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();
Заключительный шаг заключается в вызове Действия:Переопределение onActivityResult
прослушивать обратные вызовы из операции ввода текста.Получите дополнительное значение из возвращаемого намерения, чтобы получить текстовое значение, которое вы должны отображать.
@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;
}
}
}
Другие советы
Есть несколько способов, с помощью которых вы можете получить доступ к переменным или объекту в других классах или Activity.
A.База данных
B.общие предпочтения.
C.Сериализация объекта.
D.Класс, который может содержать общие данные, может быть назван как Общие утилиты, это зависит от вас.
E.Передача данных через Intents и Разделяемый интерфейс.
Это зависит от потребностей вашего проекта.
A. База данных
SQLite - это база данных с открытым исходным кодом, которая встроена в Android.SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные инструкции.
Руководства -- http://www.vogella.com/articles/AndroidSQLite/article.html
B. Общие Предпочтения
Предположим, вы хотите сохранить имя пользователя.Итак, теперь будут две вещи, а Клавиша Имя пользователя, Значение Ценность.
Как хранить
// 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(), вы можете сохранить желаемый тип данных.
Как получить
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Сериализация объектов
serlization объекта используется, если мы хотим сохранить состояние объекта для отправки его по сети, или вы также можете использовать его для своих целей.
Используйте java beans и сохраняйте в нем как одно из его полей, а для этого используйте геттеры и сеттер
JavaBeans - это классы Java, которые имеют свойства.Думайте о свойствах как о частных переменных экземпляра.Поскольку они являются частными, единственный способ к ним можно получить доступ извне их класса - это через методы в классе. Методы, которые изменяют значение свойства, называются методами установки, а методы которые извлекают значение свойства, называются методами получения.
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);
Затем используйте сериализацию объекта для сериализации этого объекта и в вашем другом классе десериализуйте этот объект.
При сериализации объект может быть представлен в виде последовательности байтов, которая включает данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После того, как сериализованный объект был записан в файл, его можно прочитать из файла и десериализовать, то есть информация о типе и байты, которые представляют объект и его данные, могут быть использованы для воссоздания объекта в памяти.
Если вам нужен учебник по этому вопросу, обратитесь по этой ссылке
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
Получить переменную в других классах
D. Обычное использование
Вы можете самостоятельно создать класс, который может содержать общие данные, которые вам часто нужны в вашем проекте.
Образец
public class CommonUtilities {
public static String className = "CommonUtilities";
}
E. Передача данных через Намерения
Пожалуйста, обратитесь к этому руководству для получения информации об этом варианте передачи данных.
тебе не обязательно..
просто вызовите newIntenet()из второго действия
Intent retData=new Intent();
Добавьте данные для передачи обратно
putExtras (retData.putExtra("userName", getUsrName()));
продолжайте с SetResult
setResult(RESULT_OK, retData);
и может потом закончить
finish();
startActivityForResult() Стартовая активностьforresult()
И вот ссылка из SDK с дополнительной информацией:
http://developer.android.com/guide/appendix/faq/commontasks.html#opennewscreen
и прокрутите вниз до части, озаглавленной "Возврат результата с экрана".
Я часто использую статические переменные в вызывающем действии со статическими методами установки для их установки.
Таким образом, я могу изменять значения в любом действии по своему желанию, независимо от точного потока управления между различными действиями.
Обратите внимание, что этот трюк можно использовать, только если вас не волнует создание нескольких копий одного и того же действия (класса) в приложении, тем не менее, я обнаружил, что это самое простое в реализации, и я использую его чаще всего.
Лучший способ сделать это - поместить переменную в общий класс, который определен вне области видимости
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);
внутри кода
@Переопределить общедоступный недействительный результат при активации (int requestCode, int resultCode, данные намерения) { если (requestCode == Ключи.ВЫБЕРИТЕ_КОНТАКТ) { if (Код результата == Действие.RESULT_OK) { Uri contactData = data.getData();
//you may use the variable here after intent result
LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....