Jak przekazać wartości z jednej czynności do poprzedniej

99

Jak przekazać wartość z jednego ekranu do poprzedniego ekranu?

Rozważ taki przypadek: mam dwie czynności. Pierwszy ekran ma jeden TextViewi przycisk, a drugie działanie ma jeden EditTexti przycisk.

Jeśli kliknę pierwszy przycisk, to musi przejść do drugiej czynności i tutaj użytkownik musi wpisać coś w polu tekstowym. Jeśli naciśnie przycisk z drugiego ekranu, wówczas wartości z pola tekstowego powinny przejść do pierwszej czynności, która powinna zostać wyświetlona w pierwszej czynności TextView.

Kumar
źródło

Odpowiedzi:

244

Przechwytywanie czynności wykonywanych na jednym działaniu w innym wymaga trzech kroków.

Uruchom działanie drugorzędne (działanie „Edytuj tekst”) jako działanie podrzędne, korzystając startActivityForResultz działania głównego.

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

W ramach podaktywności, zamiast po prostu zamykać działanie, gdy użytkownik kliknie przycisk, należy utworzyć nową intencję i dołączyć wprowadzoną wartość tekstową do pakietu dodatków. Przekazanie go z powrotem do połączenia rodzica setResultprzed wywołaniem w finishcelu zamknięcia dodatkowego działania.

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

Ostatnim krokiem jest wywołanie działania: Zastąp, onActivityResultaby nasłuchiwać wywołań zwrotnych z działania wpisu tekstowego. Pobierz dodatkowe z zwróconej intencji, aby uzyskać wartość tekstową, którą powinieneś wyświetlić.

@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; 
    } 
  } 
} 
Reto Meier
źródło
27
To wszystko działało dla mnie, z wyjątkiem tego, że new Intent(null);było „zbyt niejednoznaczne” i musiałem to zmienić new Intent();.
Richard Tingle,
1
Warto również zauważyć, że będzie to działać tylko w tym samym kontekście. Jeśli uruchomisz działanie na przykład od fragmentu, nie zadziała, ponieważ requestCode będzie za każdym razem inny. Będziesz musiał użyć metody getActivity (). StartActivityForResult () we fragmencie.
stef
10

Dostęp do zmiennych lub obiektów w innych klasach lub działaniu można uzyskać na kilka sposobów.

A. Baza danych

B. wspólne preferencje.

C. Serializacja obiektów.

D. Klasę, która może przechowywać wspólne dane, można nazwać Common Utilities, od której zależy.

E. Przekazywanie danych przez intencje i interfejs Parcelable.

To zależy od potrzeb projektu.

A. Baza danych

SQLite to baza danych typu open source, która jest osadzona w systemie Android. SQLite obsługuje standardowe funkcje relacyjnej bazy danych, takie jak składnia SQL, transakcje i przygotowane instrukcje.

Samouczki - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Wspólne preferencje

Załóżmy, że chcesz przechowywać nazwę użytkownika. Więc teraz będą dwie rzeczy: nazwa użytkownika klucza , wartość wartości.

Jak przechowywać

 // 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();

Używając putString (), putBoolean (), putInt (), putFloat (), putLong () możesz zapisać żądany typ dtatype.

Jak pobrać

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

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

C. Serializacja obiektów

Serlizacja obiektu jest używana, jeśli chcemy zapisać stan obiektu, aby wysłać go przez sieć lub możesz użyć go również do swoich celów.

Użyj fasoli java i przechowuj je jako jedno z jego pól i użyj do tego getterów i setterów

JavaBeans to klasy Java, które mają właściwości. Pomyśl o właściwościach jako prywatnych zmiennych instancji. Ponieważ są prywatne, jedynym sposobem, w jaki można uzyskać do nich dostęp spoza ich klasy, są metody w klasie. Metody zmieniające wartość właściwości nazywane są metodami ustawiającymi, a metody, które pobierają wartość właściwości, nazywane są metodami pobierającymi.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Ustaw zmienną w swojej metodzie poczty za pomocą

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Następnie użyj serializacji obiektu, aby serializować ten obiekt, aw innej klasie zdeserializuj ten obiekt.

W serializacji obiekt może być reprezentowany jako sekwencja bajtów, która zawiera dane obiektu, a także informacje o typie obiektu i typach danych przechowywanych w obiekcie.

Po zapisaniu zserializowanego obiektu do pliku można go odczytać z pliku i deserializować, co oznacza, że ​​informacje o typie i bajty reprezentujące obiekt i jego dane mogą zostać użyte do ponownego utworzenia obiektu w pamięci.

Jeśli chcesz samouczek do tego, zapoznaj się z tym linkiem

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

Pobierz zmienną w innych klasach

D. CommonUtilities

Możesz samodzielnie stworzyć klasę, która może zawierać wspólne dane, których często potrzebujesz w swoim projekcie.

Próba

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Przekazywanie danych przez intencje

Zapoznaj się z tym samouczkiem, aby poznać tę opcję przekazywania danych.

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

Nikhil Agrawal
źródło
6

nie musisz ...

Po prostu wywołaj newIntent () z drugiego działania

Intent retData=new Intent();

Dodaj dane do przekazania

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

Śmiało z setResult

setResult(RESULT_OK, retData);

I wtedy mogę skończyć

finish();
Sora
źródło
2

Często używam zmiennych statycznych w działaniu wywołującym ze statycznymi metodami ustawiającymi, aby je ustawić.

W ten sposób mogę dowolnie zmieniać wartości w dowolnej czynności, niezależnie od dokładnego przepływu kontroli między różnymi czynnościami.

Zwróć uwagę, że ta sztuczka może być użyta tylko wtedy, gdy nie zależy ci na utworzeniu instancji więcej niż jednej kopii tej samej czynności (klasy) w aplikacji, jednak uznałem, że jest to najłatwiejsze do zaimplementowania i używam go najczęściej .

Ohad Aloni
źródło
Niezbyt dobre rozwiązanie. Jest to sprzeczne z najlepszymi praktykami Androida. Nie możesz zagwarantować, że aktywność nie zostanie zabita, a nowa instancja uruchomiona przez system.
SIr Codealot
0

Najlepszym sposobem na to jest umieszczenie zmiennej we wspólnej klasie, która jest zdefiniowana poza zakresem

public class Utils 
{
    public static String mPosition;
}

wewnątrz twojego kodu (np. OnButtonClick itp ...)

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);

wewnątrz kodu

@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);
....
Alp Altunel
źródło