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


99

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

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

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



Ответы:


244

Чтобы зафиксировать действия, выполняемые в одном Activity, в другом, требуется три шага.

Запустите дополнительное действие (действие «Редактировать текст») в качестве вспомогательного действия, используя startActivityForResultиз основного действия.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

В рамках подактивности, вместо того, чтобы просто закрывать Activity, когда пользователь нажимает кнопку, вам необходимо создать новое намерение и включить введенное текстовое значение в его дополнительный пакет. Чтобы передать его обратно родительскому вызову setResultперед вызовом, finishчтобы закрыть вторичное действие.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

Последний шаг - это вызов Activity: Override onActivityResultдля прослушивания обратных вызовов из текстовой записи Activity. Получите дополнительную информацию от возвращенного Intent, чтобы получить текстовое значение, которое вы должны отображать.

@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; 
    } 
  } 
} 

27
Все это сработало для меня, за исключением того, что оно new Intent(null);было «слишком неоднозначным», и мне пришлось изменить его на new Intent();.
Ричард Тингл

1
Также стоит отметить, что это будет работать только в том же контексте. Если вы запустите действие, например, из фрагмента, это не сработает, потому что requestCode будет каждый раз другим. Вам нужно будет использовать getActivity (). StartActivityForResult () во фрагменте.
stef

Рето, не могли бы вы ответить на мой последний вопрос относительно похожего обстоятельства.
Брайан Поттс

10

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

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

Б. разделяют предпочтения.

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

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

E. Передача данных через намерения и интерфейс Parcelable.

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

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

SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы.

Учебники - http://www.vogella.com/articles/AndroidSQLite/article.html

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

Предположим, вы хотите сохранить имя пользователя. Итак, теперь будет две вещи: ключевое имя пользователя, значение- значение.

Как хранить

 // 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

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

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

Используйте 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. CommonUtilities

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

Образец

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/


6

тебе не обязательно ...

Просто вызовите newIntent () из второго действия

Intent retData=new Intent();

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

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

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

setResult(RESULT_OK, retData);

А потом можно закончить

finish();


2

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

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

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


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

0

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

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, данные намерения) {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);
....
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.