Android'deki Ana Etkinliğe geri veri gönderme


295

İki aktivitem var: ana aktivite ve çocuk aktivitesi.
Ana etkinlikte bir düğmeye bastığımda, alt etkinlik başlatılır.

Şimdi bazı verileri ana ekrana geri göndermek istiyorum. Bundle sınıfını kullandım, ama çalışmıyor. Bazı çalışma zamanı istisnaları atar.

Bunun için herhangi bir çözüm var mı?



Bir numara daha ana etkinliğinizde bir ArrayList tanımlayın ve statik hale getirin, böylece ikinci etkinlikte erişebilir, daha sonra ana etkinliğe göndermek istediğiniz veriyi ana etkinlikte erişebilirsiniz
Abhishek Yadav

Abhishek Yadav, ya ana faaliyetiniz yok ederse (onDestroy () geri arama). Bence çok iyi bir tavsiye değil.
Leontsev Anton

Yanıtlar:


474

Koşullara bağlı olarak, istediğinizi elde etmenin birkaç yolu vardır.

En yaygın senaryo (sizinki gibi görünür), listeden bir kişi seçmek veya bir iletişim kutusuna veri girmek gibi bir kullanıcı Etkinliği kullanıcı girdisi almak için kullanıldığında ortaya çıkar. Bu durumda kullanmalısınızstartActivityForResult çocuğunuzun Aktivitesini başlatmak için .

Bu, verileri kullanarak ana Etkinliğe geri göndermek için bir boru hattı sağlar setResult. SetResult yöntemi, bir int sonuç değeri ve çağıran Aktiviteye geri gönderilen bir Niyet alır.

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

Çağıran Etkinlikteki döndürülen verilere erişmek için geçersiz kıl onActivityResult. RequestCode, startActivityForResultçağrıda iletilen tam sayıya karşılık gelirken, sonuçKodu ve veri Niyeti alt Etkinlik'ten döndürülür.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

4
tamlık için bitirmek için çağrı yapmak için en iyi yer hangisidir ()? Belki uzmanlar için açıktır, ancak yeni başlayanlar için ek kaynaklara başvurmadan bilmek iyi olacaktır.
Califf

1
@jelmoodjasser Anlamak biraz zaman aldı, ancak temel olarak yeni etkinliğe Niyet ile başladığınızda, startActivityForResultsadece işlevi kullanmak zorundasınız startActivity. Bir örnek startActivityForResult(myIntent, 2);, 2'nin MY_CHILD_ACTIVITYyukarıdaki anahtar deyimindeki yerini alabilecek sonuç kodu olduğu bir örnek olabilir .
Spot

ikinci etkinlik bittiğinde ve ilk etkinliğe döndüğünde, requestCode'u bitirmeden önce ikinci etkinliğe nasıl ayarlayacağınız .... FirstActivity'de kullanmak için onActivityResult - Ahamadullah
Saikat

Niyet zorunlu mu? Eğer geri gönderecek bir şeyim yoksa, geri göndermek için boş niyete ihtiyacım var mı?
Bagus Aji Santoso

@BagusAjiSantoso amacı isteğe bağlıdır, yalnızca geri gönderecek bir şeyiniz varsa gerekir.
Narendra Singh

186

Etkinlik 1, startActivityForResult öğesini kullanır :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

Etkinlik 2 başlatılır ve işlemi gerçekleştirmek için Etkinliği kapatmak için aşağıdakileri yapın:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

Etkinlik 1 - önceki etkinlikten geri dönülmesi onActivityResult öğesini çağırır :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

GÜNCELLEME: Seenu69'un yorumuna cevap verin, İkinci etkinlikte,

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

Sonra birinci aktivitede,

int result = data.getExtra(KEY_RESULT);

Merhaba orada u soruma cevap için teşekkür ederiz.Bu kod benim için yeterli değil. Ekleme ikinci etkinliğin kendisinde gerçekleştirilmesini istiyorum ve sonuç onActivityResult yöntemiyle MainActivity'ye döndürülmelidir. Örneğin, Ana Etkinlikte yalnızca u tıklattıktan sonra ikinci etkinliğe götüren bir düğme vardır, editText widget'ı aracılığıyla iki sayı girilir, ikinci etkinliğin kendisinde ek mantık gerçekleştirilir ve son olarak sonuç MainActivity'ye döndürülür. Anladım?
Seenu69

2
Bu durumda ikinci aktivitede hesaplamayı yapar ve sonucu putExtra () ile niyette saklarsınız. Yukarıdaki cevabımı düzenledim
jimmithy

68

Verileri Geri Gönderme

Olayları bağlam içinde görmeme yardımcı oluyor. Verileri geri göndermek için basit bir proje. Burada xml mizanpaj dosyalarını sunmak yerine, bir görüntü var.

resim açıklamasını buraya girin

Ana aktivite

  • İkinci Etkinliği ile Başlat startActivityForResultİsteğe bağlı bir sonuç kodu vererek başlatın.
  • Geçersiz Kıl onActivityResult . Bu, İkinci Etkinlik bittiğinde çağrılır. İstek kodunu kontrol ederek aslında İkinci Etkinlik olduğundan emin olabilirsiniz. (Bu, aynı ana etkinlikten birden fazla farklı etkinliğe başlarken kullanışlıdır.)
  • İadeden aldığınız verileri çıkarın Intent. Veriler bir anahtar / değer çifti kullanılarak çıkarılır.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // Get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // Set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

İkinci Etkinlik

  • Önceki etkinliğe geri göndermek istediğiniz verileri bir Intent. VerilerIntent bir anahtar / değer çifti kullanılarak .
  • Sonucu olarak ayarlayın RESULT_OK verilerinizi tutan amacı ekleyin.
  • finish()İkinci Etkinliği kapatmak için arayın .

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // Get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // Put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

Diğer notlar

  • Eğer bir Fragment içindeyseniz bunun anlamını bilemez RESULT_OK. Sadece tam adını kullanın: Activity.RESULT_OK.

Ayrıca bakınız


Bu çok iyi yazılmış açık bir açıklamadır. Aferin!
Kingsley Ijike

29

FirstActivity, startActivityForResult öğesini kullanır:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

SecondActivity'de setClult olaylarında veya onBackPressed () setResult () çağrısında

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);

Bu sonuç requestCode mu?
Engr Syed Rowshan Ali

15

StartActivityForResult () yöntem çağrısını kullanarak alt etkinlik Hedefini çağırın

Burada bunun bir örneği var: http://developer.android.com/training/notepad/notepad-ex2.html

ve bunun "Ekrandan Sonuç Gönderme" bölümünde: http://developer.android.com/guide/faq/commontasks.html#opennewscreen


Evet, cbrulak ile hemfikirim, belgelere bağlantı cevaptan çok daha yararlı oldu.
george_h

Bağlantılar şimdi bazı genel şeyler gösteriyor. İçerik değiştirilebilir, lütfen güncelleyin ya da topluluk yanıtını kaldırın
Manoranjan

7

Daha iyi referansınız için basit bir demo sınıfı oluşturdum.

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

Ve işte SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}

3
iyi açıkladı!
Radhey

5

İlk aktivitede u kullanarak niyet gönderebilir startActivityForResult()ve daha sonra kullanımı bittikten sonra ikinci aktiviteden sonuç alabilirsiniz setResult.

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

1

Tüm bu cevaplar, verileri gönderdikten sonra ikinci etkinliğinizin tamamlanması gereken senaryoyu açıklıyor.

Ancak ikinci etkinliği bitirmek istemiyorsanız ve önce verileri tekrar göndermek istiyorsanız BroadCastReceiver kullanabilirsiniz.

İkinci Faaliyette -

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

İlk Faaliyette

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

Alıcıyı onCreate () 'de kaydedin -

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

OnDestroy () içindeki kaydı sil


0

Durumunuza bağlı olarak daha iyi olabilecek istenen sonucu elde etmenin bir başka yolu da bir dinleyici arabirimi oluşturmaktır.

Üst etkinliğin, parametre olarak gerekli verileri iletirken alt etkinlik tarafından tetiklenen bir arabirimi dinletmesini sağlayarak benzer bir durum kümesi oluşturabilirsiniz


-1

Bunu yapmanın bazı yolları vardır. 1. yukarıdaki yanıtlarda çok iyi açıklanmış olan startActivityForResult () yöntemini kullanarak.

  1. "Utils" sınıfınızda veya kendi sınıfınızda statik değişkenler oluşturarak. Örneğin ActivityI için studentId geçmek istiyorum.İlk olarak benim ActivityA ActivityB çağırıyor. Sonra ActivityB içinde studentId (Utils.class içinde statik bir alan) ayarlayın. Bunun gibi Utils.STUDENT_ID = "1234"; daha sonra AktiviteA'ya geri dönerken Utils.STUDENT_ID içinde saklanan studentId öğesini kullanın.

  2. Uygulama Sınıfınızda bir alıcı ve ayarlayıcı yöntemi oluşturarak.

bunun gibi:

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

işiniz bitti. u ActivityB'deyken içindeki verileri ayarlayın ve ActivityA'ya geri döndükten sonra verileri alın.


-1

Yukarıdaki cevaplarda eksik olduğunu düşündüğüm küçük bir detay.

Çocuğunuz etkinliği Birden fazla ana faaliyetlerinden açılabilir Eğer yapmanız gerekiyorsa o zaman kontrol edebilirsiniz setResultetkinlik tarafından açılmışsa dayalı ya da değil startActivityya startActivityForResult. Bunu kullanarak elde edebilirsiniz getCallingActivity(). Daha fazla bilgi burada .


-2

SharedPreferences kullanın ve verilerinizi kaydedin ve uygulamadaki herhangi bir yerden erişin

tarihi böyle kaydet

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

Ve bunun gibi verileri alın

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

6
İkinci etkinliğin uygulamada kalıcı bir değişiklik / ayar oluşturması durumunda bu daha uygun olacaktır.
elimirks

2 farklı android uygulaması arasında veri paylaşmak istersem bu işe yarar mı?
joey rohan

21
Bu SharedPreferences kötüye kullanımıdır.
Eran Goldin

1
Sadece iki aktivite (OP'nin orijinal sorusu) arasında veri aktarmak için bu yöntemi kullanmak SharedPreferences'ı kötüye kullanmak gibidir. Bunun için tasarlanmamıştır ve sistem, iki etkinlik arasında veri iletmek gibi basit bir görev için çok fazla iş yapmak zorundadır (depolama alanına xml yazmak ve tekrar okumak).
Sudara
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.