Geri basıldığında 2. aktiviteden 1. aktiviteye nasıl veri aktarılır? - android


186

Etkinlik1 ve Etkinlik2 olmak üzere 2 etkinliğim var .

In Activity1I Bir ettik Düğme ve TextView . Düğme tıklandığında Etkinlik2 başlatılır.

In Activity2I bir ettik EditText .

Ben alınan verileri görüntülemek istediğiniz EditText içinde Activity2 içinde TextView içinde Activity1 geri gelen basıldığında Activity2 .

birisi bu işi yapmak için kod bana yardımcı olabilir?


2
hakkında okumakstartActivityForResult
Dmitry Zaytsev


Başka bir yol: Activity2değeri kalıcı depolama alanına koyar ve Activity1oradan okur.
Henry

@kumareloaded: Çözümü burada paylaşır mısınız? Pastebin şu an ülkemde çalışmıyor.
user1903022

Yanıtlar:


328

Etkinlik2 ile başlayın startActivityForResultve setResultverileri Etkinlik2'den Etkinlik1'e geri gönderme yöntemini kullanın . Etkinlik1'de Etkinlik2'deki verilerle onActivityResultgüncelleme TextViewyapmak için geçersiz kılmanız gerekir EditText.

Örneğin:

In Activity1 , Activity2 olarak başlar:

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

In Activity2 , kullanım setResultverilerini göndermek için geri:

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

Ve de Activity1 , veri ile almak 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");
         }     
    }
} 

Yapabiliyorsanız, Etkinlikler arasında veri paylaşmak için SharedPreferences'ı de kullanın .


1
teşekkürler adam, yapabilirsen SharedPreferences aynı şeyi yapmak için benzer kodlama kısmı ile bana yardımcı olabilir :)
kumareloaded

1
@kumareloaded: en hoş arkadaş. kullanarak aynı şeyi yapmak istiyorsanız SharedPreferenceso zaman bu örneğe bakın
ρяσѕρєя K

2
@kumareloaded: bana u her iki sınıfın kod linkleri verirseniz u pastebin.com kullanarak denedikten sonra kodunuzu düzenleyeceğim
ρяσѕρєя K

1
@kumareloaded: şimdi bu kodu kullanın ve bu işe yarayacak
ρяσѕρєя K

1
@ ρяσѕρєяK: Cevabınızda SharedPref kullanarak yukarıdaki senaryo kodunu paylaşır mısınız? Pastebin pek çok ülkede açılmaz. Burada paylaşmak çok yardımcı olur, teşekkürler.
user1903022

27

Etkinlik1 , Etkinlik2 ile başlamalıdır startActivityForResult().

Etkinlik2 , setResult()verileri Etkinlik1'e geri göndermek için kullanılmalıdır .

In Activity2 ,

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

In Activity1 ,

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

@Swayam Sanırım aktivite1'den bahsetmediniz çünkü etkinlik2'ye startactivityforresult ile başlamalısınız.
LutfiTekin

1
@LutfiTekin: Bu çok iyi olabilir! Gösterdiğiniz için teşekkürler! Cevabımı düzenledi. :)
Swayam

17

Ben koyduğunuzda diğer cevaplar çalışmıyordu setResultiçinde onBackPressed. Super'e yapılan çağrıyı yorumlamak onBackPressedve finishmanuel olarak çağrı yapmak sorunu çözer:

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

Ve ilk aktivitede:

@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

Bunu startActivityforResult için alternatif olarak alın.Ancak bu gibi durumlarda bu yaklaşımın performans açısından pahalı olabileceğini unutmayın, ancak bazı durumlarda kullanmanız gerekebilir.

Etkinlik2'de,

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

Etkinlik1'de,

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

Bu nesne için kullanılamaz (yalnızca dize, boole vb.)
FindOut_Quran

1
Benim durumumda MainActivity'deki bir liste öğesinden bir etkinlik başlatıyordum ve kullanıcının oluşturduğu verileri o liste öğesine geri getirmek istedim. mContext.startActivity () kullandığım durumda startActivityForResult () benim için uygun değildi. @katmanco örneği burada yararlı bir işti.
Hatalı

benim için bu kötü bir seçim. actionForResult
marlonpya

3

FirstActivity'nizden startActivityForResult () yöntemini kullanarak SecondActivity'yi çağırın.

Örneğin:

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

SecondActivity'de, FirstActivity'ye geri dönmek istediğiniz verileri ayarlayın. Geri dönmek istemiyorsanız, ayarlamayın.

Örneğin: secondActivity'de verileri geri göndermek istiyorsanız:

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

Verileri iade etmek istemiyorsanız:

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

Şimdi FirstActivity sınıfınızda onActivityResult () yöntemi için aşağıdaki kodu yazın.

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

2

bu sizin ilk Aktiviteniz1.

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

Buradan startActivityForResult (mRequestCode, Activity2.class) kullanarak Activity2.class'ınızı başlatıyorsunuz;

Şimdi bu sizin ikinci Aktiviteniz, adı Aktivite2

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

}

Şimdi ikinci Aktivitenizi bitirdiğinizde onResack () yöntemini onBackPress () 'den ya da Aktivite2'nizin yok olacağı herhangi bir düğmeye tıkladığınızda Aktivite1'inizin geriAçıklamaYöntemi () oradan verilerinizi arayabilir ..

Size yardımcı olacağını umuyoruz ... :)



1

TL; DR Kullanımı Activity.startActivityForResult

Uzun cevap:

Android geliştirici belgelerini okuyarak başlamalısınız. Özellikle sorunuzun Starting Activities and Getting Resultskonusu Activitydokümantasyon bölümünde ele alınmıştır .

Örneğin kod olarak, Android SDK iyi örnekler sunar. Ayrıca, buradaki diğer yanıtlar size kullanılacak örnek kodun kısa parçacıklarını verir.

Ancak, alternatif arıyorsanız, bu SO sorusunu okuyun . Bu, startActivityForResultsfragmanlarla nasıl kullanılacağı ve aktiviteler arasında veri geçişi için birkaç yaklaşımın iyi bir tartışmasıdır .


0

Bunu yaptım bu yüzden ve ben ilk ben yaptım, ben yapmış bir yumuşak Button ve her Android Aygıt varsayılan olan yazılım tuşu bu gönderme veri türünü yapmak istediği bir sorunu var Intentiçinde benim "A" Activity:

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

Sonra ikinci etkinliğimde, "B" de bir Alan beyan ettim Activity:

private static int resultCode = 40;

daha sonra isteğimi başarılı bir şekilde yaptıktan sonra veya "A" Etkinliğini burada bu işin başarıyla yapıldığını söylemek istediğimde, sonuçKodunun değerini "A" Activityda "60" dediği gibi değiştirdim. sonra:

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

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

Not: SuperDüzgün çalışmasını istiyorsanız, onBackPressed Yönteminden kaldırmayı unutmayın .

o zaman onActivityResultbenim "A" Faaliyet de Yöntem çağırmalısınız :

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

işte bu, umarım size yardımcı olur. #HappyCoding;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.