Как передать значения из одного действия в предыдущее действие - PullRequest
94 голосов
/ 14 июля 2009

Как передать значение с одного экрана на предыдущий экран?

Рассмотрим этот случай: у меня есть два занятия. На первом экране есть одна TextView и кнопка, а во второй операции - одна EditText и кнопка.

Если я нажимаю первую кнопку, то она должна перейти ко второму действию, и здесь пользователь должен что-то ввести в текстовое поле. Если он нажимает кнопку со второго экрана, то значения из текстового поля должны перейти к первому действию, которое должно отображаться в первом занятии TextView.

Ответы [ 6 ]

226 голосов
/ 14 июля 2009

Для захвата действий, выполняемых над одним действием в другом, требуется три шага.

Запустите вторичное действие (ваше действие «Редактировать текст») как вспомогательное действие, используя 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; 
    } 
  } 
} 
10 голосов
/ 26 июня 2013

Есть несколько способов получить доступ к переменным или объектам в других классах или в Activity.

A. База данных

B. общие настройки.

C. Сериализация объекта.

D. Класс, который может содержать общие данные, может называться Common Utilities, это зависит от вас.

Е. Передача данных через интерфейс Intents и Parcelable.

Это зависит от потребностей вашего проекта.

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

С. Сериализация объекта

Объектная серизация используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы можете использовать его для своих целей.

Используйте Java-бины и сохраняйте их как одно из его полей и используйте для этого геттеры и сеттеры

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. CommonUtilities

Вы можете самостоятельно создать класс, который может содержать общие данные, которые вам часто нужны в вашем проекте.

Sample

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Передача данных через содержимое

Пожалуйста, обратитесь к этому руководству для этой опции передачи данных.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

5 голосов
/ 20 февраля 2011

вам не нужно ..

просто вызовите newIntenet () из второго действия

Intent retData=new Intent();

Добавить данные для передачи обратно

putExtras (retData.putExtra("userName", getUsrName()));

продолжайте с setResult

setResult(RESULT_OK, retData);

и затем может закончить

finish();
4 голосов
/ 14 июля 2009

startActivityForResult ()

А вот ссылка из SDK с дополнительной информацией:

http://developer.android.com/guide/appendix/faq/commontasks.html#opennewscreen

и прокрутите вниз до части под названием «Возвращение результата с экрана»

2 голосов
/ 19 мая 2011

Я часто использую статические переменные в вызывающей деятельности со статическими методами установки, чтобы установить их.

Таким образом, я могу изменять значения в любой деятельности по желанию, независимо от точного потока контроля между различными действиями.

Обратите внимание, что этот трюк можно использовать, только если вы не заботитесь о создание более одной копии одного и того же действия (класса) в приложении, тем не менее, я обнаружил, что это проще всего реализовать, и я использую его чаще всего.

0 голосов
/ 14 ноября 2017

Лучший способ сделать это - поместить переменную в общий класс, который определен вне области действия

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) { 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);
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...