Jak przekazać dane z drugiej aktywności do pierwszej aktywności po ponownym naciśnięciu? - Android


185

Mam 2 działania, Działanie 1 i Działanie 2 .

W Activity1Mam przycisk i TextView . Po kliknięciu przycisku uruchamiane jest działanie 2 .

W Activity2Mam EditText .

Chcę wyświetlić dane pobrane z EditText w Activity2 w TextView w Activity1 po naciśnięciu przycisku Wstecz z Activity2 .

czy ktoś może mi pomóc z kodem, aby to zadziałało?


2
czytaj dalejstartActivityForResult
Dmitrij Zajcew


Inny sposób: Activity2umieszcza wartość w trwałym magazynie i Activity1odczytuje ją stamtąd.
Henry

@kumareloaded: Czy możesz podzielić się rozwiązaniem tutaj. Pastebin nie działa obecnie w moim kraju.
user1903022

Odpowiedzi:


327

Uruchom działanie 2 za pomocą startActivityForResulti użyj setResultmetody wysyłania danych z działania 2 do działania 1. W Activity1 trzeba będzie zastąpić onActivityResultza aktualizację TextViewz EditTextdanymi z Activity2.

Na przykład:

W działaniu 1 uruchom działanie 2 jako:

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

W Activity2 użyj setResultdo odesłania danych:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

A w Activity1 otrzymuj dane z onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

Jeśli możesz, użyj również SharedPreferences do udostępniania danych między działaniami.


1
dzięki stary, jeśli możesz, możesz pomóc mi z podobną częścią kodowania dla SharedPreferences, aby zrobić to samo :)
kumareloaded 12.01.2013

1
@kumareloaded: najbardziej mile widziany przyjaciel. jeśli chcesz zrobić to samo za pomocą, SharedPreferenceszobacz ten przykład
ρяσсρєя K

2
@kumareloaded: jeśli podasz mi linki do obu klas z tym, czego próbowałeś za pomocą pastebin.com, wtedy zmodyfikuję Twój kod
ρяσсρєя K

1
@kumareloaded: teraz użyj tego kodu, a to zadziała
ρяσсρєя K

1
@ ρяσсρєяK: Czy możesz podać kod dla powyższego scenariusza, używając SharedPref w swojej odpowiedzi. Pastebin nie otwiera się w wielu krajach. Udostępnienie go tutaj byłoby bardzo pomocne, dziękuję.
user1903022

26

Aktywność 1 powinna rozpocząć Aktywność 2 od startActivityForResult().

Działanie 2 powinno zostać użyte setResult()do wysłania danych z powrotem do działania 1 .

W Activity2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

W Activity1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayam Chyba dlatego, że nie wspomniałeś o działaniu 1, powinieneś zacząć działanie 2 od startactivityforresult.
LutfiTekin,

1
@LutfiTekin: To może być bardzo dobrze! Dzięki za wskazanie tego! Edytowałem moją odpowiedź. :)
Swayam

17

Pozostałe odpowiedzi nie działa, kiedy kładę setResultsię onBackPressed. Komentowanie połączenia z super onBackPressedi dzwonienie finishręcznie rozwiązuje problem:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

I w pierwszej aktywności:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

6

Weź to jako alternatywę dla startActivityforResult.Ale pamiętaj, że w takich przypadkach takie podejście może być kosztowne pod względem wydajności, ale w niektórych przypadkach może być konieczne użycie.

W ćwiczeniu 2

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

W działaniu 1

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

Nie można tego użyć dla obiektu (tylko ciąg znaków, wartość logiczna itp.)
FindOut_Quran

1
W moim przypadku uruchamiałem działanie z elementu listy w MainActivity i chciałem odzyskać dane utworzone przez użytkownika z powrotem do tego elementu listy. StartActivityForResult () nie był dla mnie dostępny w tym przypadku, gdy korzystałem z mContext.startActivity (). Przykład @katmanco tutaj był pomocny.
Wadliwy

dla mnie to złe wybory. istnieje akcjaForResult
marlonpya

2

to twoja pierwsza aktywność1.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Stąd zaczynasz swoją klasę Activity2.class za pomocą startActivityForResult (mRequestCode, Activity2.class);

To jest twoje drugie działanie, nazywa się Activity2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Teraz, kiedy skończysz z drugą aktywnością, wówczas wywołujesz metodę setResult (), onBackPress () lub kliknięcie dowolnego przycisku, gdy Activity2 niszczy, a następnie metoda wywołania aktywności Activity1 naActivityResult () wywołuje stamtąd, możesz pobrać dane z zamiaru ..

Mam nadzieję, że ci to pomoże ... :)



2

Z poziomu FirstActivity wywołaj SecondActivity za pomocą metody startActivityForResult ().

Na przykład:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

W SecondActivity ustaw dane, które chcesz powrócić do FirstActivity. Jeśli nie chcesz wracać, nie ustawiaj żadnych.

Na przykład: W secondActivity, jeśli chcesz odesłać dane:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Jeśli nie chcesz zwracać danych:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Teraz w klasie FirstActivity napisz następujący kod dla metody onActivityResult ().

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}

1

TL; DR Użyj Activity.startActivityForResult

Długa odpowiedź:

Powinieneś zacząć od przeczytania dokumentacji dla programistów Androida. W szczególności temat twojego pytania jest omówiony w Starting Activities and Getting Resultsczęści Activitydokumentacji.

Na przykład kod, zestaw SDK systemu Android zapewnia dobre przykłady. Również inne odpowiedzi tutaj dostarczają krótkich fragmentów przykładowego kodu do użycia.

Jeśli jednak szukasz alternatyw, przeczytaj to pytanie SO . To dobra dyskusja na temat korzystania startActivityForResultsz fragmentów, a także kilka innych podejść do przekazywania danych między działaniami.


0

i mam problem, który chciałem zrobić, wysyłając ten typ danych w przycisku programowym, który stworzyłem, i przycisk programowy, który jest domyślny w każdym urządzeniu z Androidem, więc zrobiłem to, najpierw zrobiłem Intentw moim „A” Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Następnie w mojej drugiej działalności zadeklarowałem pole w moim „B” Activity:

private static int resultCode = 40;

następnie po pomyślnym wysłaniu zapytania lub za każdym razem, gdy chciałem powiedzieć czynności „A”, że to zadanie zostało pomyślnie wykonane, zmień wartość parametru wynikowego na to samo, co powiedziałem w „A”, Activityco w moim przypadku to „60” i następnie:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS: Pamiętaj, aby usunąć Supermetodę onBackPressed, jeśli chcesz, aby działała poprawnie.

wtedy powinienem również wywołać onActivityResultmetodę w moim działaniu „A”:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

to wszystko, mam nadzieję, że to ci pomoże. #HappyCoding;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.