2009-07-14 11 views
86

Jak przekazać wartość z jednego ekranu do poprzedniego?Jak przekazywać wartości z jednej aktywności do poprzedniej aktywności?

Rozważmy tę sprawę: Mam dwie czynności. Pierwszy ekran ma jeden TextView i przycisk, a drugi ma jeden EditText i przycisk.

Po kliknięciu pierwszego przycisku należy przejść do drugiej czynności i tutaj użytkownik musi wpisać coś w polu tekstowym. Jeśli naciśnie przycisk z drugiego ekranu, wartości z pola tekstowego powinny przejść do pierwszego działania, które powinno zostać wyświetlone w pierwszej aktywności TextView.

Odpowiedz

211

Aby przechwytywać akcje wykonywane na jednym działaniu w ramach innego, należy wykonać trzy kroki.

Uruchom drugą aktywność (aktywność "Edytuj tekst") jako subaktywność, używając startActivityForResult z głównej aktywności.

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

W Poddziałanie, zamiast po prostu zamykając aktywny, gdy użytkownik kliknie przycisk, trzeba utworzyć nowy Intent i obejmują wprowadzoną wartość tekstową w jego dodatkami wiązki. Aby przekazać go do nadrzędnego połączenia, należy wywołać przed wywołaniem, aby zamknąć działanie wtórne.

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

Ostatnim krokiem jest w Działaniu wywołującego: Przestawianie onActivityResult do nasłuchiwania wywołań zwrotnych z działalności wprowadzania tekstu. Uzyskaj dodatkową wartość ze zwróconego celu, 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; 
    } 
    } 
} 
+27

To wszystko działało dla mnie z wyjątkiem 'new Intent (null);' było "zbyt niejednoznaczne" i musiałem zmienić to na 'new Intent();'. –

+0

To jest po prostu świetne: D –

+0

Warto również zauważyć, że to będzie działać tylko w tym samym kontekście.Jeśli na przykład uruchomi się działanie z fragmentu, nie będzie działać, ponieważ kod żądania będzie za każdym razem inny. Będziesz musiał użyć getActivity(). StartActivityForResult() w fragmencie. – stef

5

nie masz ..

zadzwoń newIntenet() z drugiej aktywności

Intent retData=new Intent(); 

Dodawanie danych do przekazania z powrotem

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

iść do przodu z setResult

setResult(RESULT_OK, retData); 

i może zakończyć

finish(); 
+0

Brakuje zbliżenia w drugim wierszu kodu. Gwiazdki? – JohnK

2

często używać zmiennych statycznych w aktywności wywołującej ze statycznych metod dostępowych do ich ustawiania.

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

Zauważ, że ta sztuczka może być używany tylko jeśli nie dbają o instancji więcej niż jednej kopii tej samej działalności (klasy) w aplikacji, jeszcze znalazłem, że jest to najłatwiejszy do wykonania, i używam go najbardziej.

+0

Nie jest to świetne rozwiązanie. Jest to niezgodne z najlepszą praktyką Androida. Nie możesz zagwarantować, że działanie nie zostanie zabite, a nowa instancja uruchomiona przez system. –

9

Istnieje kilka sposobów uzyskania dostępu do zmiennych lub obiektów w innych klasach lub w Działalności.

A. Baza danych

B. wspólne preferencje.

C. Serializacja obiektów.

D. Klasa, która może przechowywać wspólne dane, może być nazwana jako Wspólne narzędzia, od których zależy użytkownik.

E. Przekazywanie danych za pośrednictwem Intents i Parcable Interface.

To zależy od potrzeb projektu.

A. Database

SQLite jest Open Database źródłowy, który jest osadzony w Androidzie. SQLite obsługuje standardowe funkcje relacyjnych baz danych, takie jak składnia SQL, transakcje i przygotowane instrukcje.

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

B. Shared Preferencje

Załóżmy, że chcesz zapisać nazwę użytkownika. Tak więc teraz będą dwie wartości: Nazwa użytkownika, WartośćWartość.

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

Korzystanie putString(), putBoolean(), putInt(), putFloat(), putLong() można zapisać żądany 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. obiektu serializacji

serlization Przedmiot jest używany, jeśli chcemy zapisać stan obiektu, aby wysłać go za pośrednictwem sieci lub możesz go użyć również do swojego celu.

fasola użyć Java i przechowywać w nim jako jeden z jego pola i zastosowania pobierające i setter dla tej

JavaBeans są klasami Java, które mają właściwości. Pomyśl o właściwościach jako zmiennych instancji prywatnych. Ponieważ są one prywatne, dostęp do nich spoza ich klasy można uzyskać tylko za pomocą metod dostępnych w klasie.Metody, które zmieniają wartość właściwości, nazywane są metodami ustawiającymi, a metody, które pobierają wartość właściwości, nazywane są metodami getter.

public class VariableStorage implements Serializable { 

    private String inString ; 

    public String getInString() { 
     return inString; 
    } 

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


} 

Ustaw zmienną w sposób Ci maila za pomocą

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

Następnie użyj obiektu Serialzation do serializacji ten obiekt, a w drugiej klasie deserializowania tego obiektu.

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

Po zapisaniu serializowanego obiektu do pliku, można go odczytać z pliku i przekształcić z postaci szeregowej, tj. Informacje o typie i bajty reprezentujące obiekt, a jego dane można wykorzystać do odtworzenia obiektu w pamięci.

Jeśli chcesz Tutorial ten odnosi ten link

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

Get variable in other classes

D. CommonUtilities

można utworzyć klasę przez siebie, które mogą zawierać dane, które wspólnego często potrzebujesz w swoim projekcie.

Próbka

public class CommonUtilities { 

    public static String className = "CommonUtilities"; 

} 

E. Przekazywanie danych przez zamiarów

Zapoznaj samouczek dla tej opcji przekazywania danych.

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

0

Najlepszym sposobem na to jest, aby umieścić zmienną do wspólnej klasy, który jest zdefiniowany poza zakresem

public class Utils 
{ 
    public static String mPosition; 
} 

wewnątrz kodu (np OnButtonClick etc ...)

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 void onActivityResult (Int requestCode int ResultCode, dane zamiar) {if (requestCode == Keys.PICK_CONTACT) {if (ResultCode == Activity.RESULT_OK) { Uri Obecne dane kontaktowe = data.getData();

  //you may use the variable here after intent result 
      LogHelper.e(TAG, "after intent: " + Utils.mPosition); 
.... 
Powiązane problemy