Як передати значення від однієї діяльності до попередньої


97

Як передати значення з одного екрана на попередній екран?

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

Якщо я натискаю першу кнопку, то вона повинна перейти до другої активності, і тут користувач повинен ввести щось у текстове поле. Якщо він натисне кнопку на другому екрані, то значення з текстового поля повинні переміститися до першого виду, і вони повинні відображатися в першому дії TextView.



Відповіді:


241

Для захоплення дій, що виконуються над однією діяльністю в межах іншого, потрібно три кроки.

Запустіть вторинну Діяльність (Вашу Діяльність «Редагування тексту») як субактивність, використовуючи 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();

Заключний крок - у "Активність дзвінка": Переосмислить onActivityResultслухати зворотні дзвінки з пункту "Активність введення тексту". Отримайте додаткове з поверненого 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. Клас, який може вміщувати загальні дані, можна назвати загальними утилітами, це залежить від вас.

E. Передача даних через Наміри та Парцельований Інтерфейс.

Це залежить від потреб вашого проекту.

А. База даних

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 (), ви можете зберегти бажаний dtatype.

Як отримати

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Серіалізація об’єктів

Сертифікація об'єкта використовується, якщо ми хочемо зберегти стан об'єкта для надсилання його по мережі або ви також можете використовувати його за вашими цілями.

Використовуйте квасолю ява та зберігайте в ній одне з його полів та використовуйте для цього геттери та сетер

JavaBeans - класи Java, які мають властивості. Розгляньте властивості як приватні змінні екземпляра. Оскільки вони приватні, єдиний спосіб отримати доступ до них за межами класу - це методи у класі. Методи, що змінюють значення властивості, називаються методами встановлення, а методи, які отримують значення властивості, називаються методами 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);

Потім використовуйте об'єктну серіалізацію для серіалізації цього об'єкта, а в іншому класі десеріалізуйте цей об'єкт.

При серіалізації об'єкт може бути представлений у вигляді послідовності байтів, що включає дані об'єкта, а також інформацію про тип об'єкта та типи даних, що зберігаються в об'єкті.

Після того, як серіалізований об'єкт записано у файл, його можна прочитати з файлу та десеріалізувати, тобто інформацію про тип та байти, що представляють об'єкт та його дані, можна використовувати для відтворення об'єкта в пам'яті.

Якщо ви хочете посібник для цього, перейдіть за цим посиланням

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Отримайте змінну в інших класах

D. Загальні комунальні послуги

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

Зразок

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 == Ключі.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.