Değerler bir aktiviteden önceki aktiviteye nasıl aktarılır


100

Bir ekrandan önceki ekrana nasıl değer aktarırım?

Şu durumu düşünün: İki faaliyetim var. İlk ekranda bir TextViewve bir düğme vardır ve ikinci etkinlikte bir EditTextve bir düğme bulunur.

İlk düğmeye tıklarsam, ikinci etkinliğe geçmeli ve burada kullanıcının metin kutusuna bir şey yazması gerekir. İkinci ekrandan düğmeye basarsa, metin kutusundaki değerler ilk aktiviteye taşınmalı ve bu ilk aktivitede gösterilmelidir TextView.



Yanıtlar:


244

Bir Aktivite üzerinde gerçekleştirilen eylemleri diğerinde yakalamak için üç adım gerekir.

startActivityForResultAna Aktivitenizden kullanarak ikincil Aktiviteyi ('Metni Düzenleme' Aktiviteniz) bir alt aktivite olarak başlatın .

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

Alt etkinlik içinde, bir kullanıcı düğmeyi tıkladığında Etkinliği kapatmak yerine, yeni bir Amaç oluşturmanız ve girilen metin değerini ekstra paketine dahil etmeniz gerekir. İkincil Aktiviteyi kapatmak için aramadan setResultönce ana aramaya geri göndermek için finish.

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

Son adım, Activity onActivityResultmetin girişinden geri aramaları dinlemek için Aktivite: Geçersiz Kılma çağrısıdır . Görüntülemeniz gereken metin değerini almak için döndürülen Amaçtan fazladan alın.

@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
Bu new Intent(null);, "çok belirsiz" olması dışında benim için çalıştı ve bunu olarak değiştirmek zorunda kaldım new Intent();.
Richard Tingle

1
Ayrıca, bunun yalnızca aynı bağlamda çalışacağını belirtmekte fayda var. Aktiviteyi örneğin bir parçadan başlatırsanız, çalışmaz çünkü requestCode her seferinde farklı olacaktır. Parçada getActivity (). StartActivityForResult () kullanmanız gerekir.
stef

Reto - benzer bir durumla ilgili en son soruma bakar mısınız?
Bryan Potts

10

Diğer sınıflarda veya Aktivitede değişkenlere veya nesneye erişebilmenizin birkaç yolu vardır.

A. Veritabanı

B. paylaşılan tercihler.

C. Nesne serileştirme.

D. Ortak verileri tutabilen bir sınıf, size bağlı olan Common Utilities olarak adlandırılabilir.

E. Amaçlar ve Ayrıştırılabilir Arabirim aracılığıyla veri aktarımı.

Proje ihtiyaçlarınıza bağlıdır.

A. Veritabanı

SQLite, Android'e gömülü bir Açık Kaynak Veritabanıdır. SQLite, SQL sözdizimi, işlemler ve hazırlanmış ifadeler gibi standart ilişkisel veritabanı özelliklerini destekler.

Eğiticiler - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Paylaşılan Tercihler

Kullanıcı adını saklamak istediğinizi varsayalım. Yani artık iki şey olacak: Anahtar Kullanıcı Adı, Değer Değer.

Nasıl saklanır

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

PutString (), putBoolean (), putInt (), putFloat (), putLong () kullanarak istediğiniz dtatipi kaydedebilirsiniz.

Nasıl getirilir

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

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

C. Nesne Serileştirme

Nesne serizasyonu, bir nesne durumunu ağ üzerinden göndermek için kaydetmek istiyorsak kullanılır veya siz de amacınız için kullanabilirsiniz.

Java çekirdeklerini kullanın ve tarlalarından biri olarak içinde saklayın ve bunun için alıcılar ve ayarlayıcı kullanın

JavaBeans, özelliklere sahip Java sınıflarıdır. Özellikleri özel durum değişkenleri olarak düşünün. Özel olduklarından, sınıflarının dışından erişebilmelerinin tek yolu sınıftaki yöntemlerdir. Bir özelliğin değerini değiştiren yöntemlere ayarlayıcı yöntemler denir ve bir özelliğin değerini alan yöntemlere alıcı yöntemler denir.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Posta yönteminizdeki değişkeni kullanarak ayarlayın

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

Daha sonra bu nesneyi serileştirmek ve diğer sınıfınızda bu nesneyi seri durumdan çıkarmak için Serialzation nesnesini kullanın.

Serileştirmede bir nesne, nesnenin verilerini ve nesnenin türü ve nesnede depolanan veri türleri hakkındaki bilgileri içeren bir bayt dizisi olarak temsil edilebilir.

Serileştirilmiş bir nesne bir dosyaya yazıldıktan sonra, dosyadan okunabilir ve serileştirilebilir, yani nesneyi temsil eden tür bilgileri ve baytlar ve verileri bellekteki nesneyi yeniden oluşturmak için kullanılabilir.

Bunun için öğretici istiyorsanız bu bağlantıya bakın

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

Diğer sınıflarda değişken alın

D. CommonUtilities

Kendi başınıza, projenizde sıkça ihtiyaç duyduğunuz ortak verileri içerebilecek bir sınıf oluşturabilirsiniz.

Örneklem

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Verileri Amaçlar Aracılığıyla Aktarma

Bu veri geçirme seçeneği için lütfen bu eğiticiye bakın.

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


6

zorunda değilsin ...

İkinci aktiviteden newIntent () 'i çağırmanız yeterli

Intent retData=new Intent();

Geri vermek için veri ekleyin

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

SetResult ile devam edin

setResult(RESULT_OK, retData);

Ve sonra bitirebilir

finish();


2

Çağrı etkinliğinde genellikle statik değişkenleri ayarlamak için statik ayarlayıcı yöntemleriyle kullanıyorum.

Bu şekilde, çeşitli faaliyetler arasındaki kesin kontrol akışına bakılmaksızın, herhangi bir faaliyetteki değerleri istediğim zaman değiştirebilirim.

Bu numaranın yalnızca uygulamada aynı aktivitenin (sınıfın) birden fazla kopyasının somutlaştırılması umurunuzda değilse kullanılabileceğini unutmayın, ancak bunu en kolay uygulama olarak buldum ve en çok ben kullanıyorum .


Harika bir çözüm değil. Bu, Android'in en iyi uygulamasına aykırıdır. Bir aktivitenin öldürülmeyeceğini ve sistem tarafından yeni bir örneğin başlatılmayacağını garanti edemezsiniz.
SIr Codealot

0

Burada yapmanın en iyi yolu, değişkeni kapsam dışında tanımlanan ortak bir sınıfa koymaktır.

public class Utils 
{
    public static String mPosition;
}

kodunuzun içinde (ör. OnButtonClick vb ...)

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

kodunun içinde

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