Bir değişkeni Etkinlik'ten Fragman'a nasıl geçirebilir ve geri döndürebilirim?


135

Şu anda bir android uygulaması yapıyorum ve etkinlik ve parça arasında bir tarih geçirmek istiyorum. Etkinliğimde şu parçayı açan bir düğme var: DatePickerFragment.

Etkinliğimde, parçayla değiştirmek istediğim bir tarih gösteriyorum. Bu yüzden tarihi datepicker'a geçirmek ve aktiviteye geri göndermek istiyorum.

Çok fazla çözüm denedim, ama hiçbiri çalışmıyor. Kolay yol bir argümanı geçecektir, ancak bu parçalarla yapılamaz.


Benim sorunum seninkiyle tamamen aynı. Örneklerin neden parçalara kendilerini yalnızca tarih seçicinin "kullanıcıları" olarak davrandığını merak ediyorum, onları başlatan aktivite değil.
Claudio

Yanıtlar:


213

Bir parçaya bilgi iletmek için , onu oluşturduğunuzdaArAruments öğesini ayarlarsınız ve bu bağımsız değişkeni daha sonra parçanızın onCreate veya onCreateView yönteminde alabilirsiniz.

Parçanızın newInstance işlevinde, ona göndermek istediğiniz bağımsız değişkenleri eklersiniz:

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

Daha sonra yöntemdeki parçanın içinde onCreateveya onCreateViewbunun gibi argümanları alabilirsiniz:

Bundle args = getArguments();
int index = args.getInt("index", 0);

Şimdi parçanızdan etkinliğinizle (veri gönderip göndermeme) iletişim kurmak istiyorsanız , arayüzler kullanmanız gerekir. Bunu yapmanın yolu, parçalar arasındaki iletişimin dokümantasyon öğreticisinde gerçekten iyi açıklanmıştır. Tüm fragmanlar etkinlik yoluyla birbirleriyle iletişim kurduğundan, bu öğreticide, etkinlikteki bu verileri kullanmak veya etkinliğinizin içerdiği başka bir fragmana göndermek için gerçek fragmandan etkinlik konteynerine nasıl veri gönderebileceğinizi görebilirsiniz.

Dokümantasyon eğitimi:

http://developer.android.com/training/basics/fragments/communicating.html


10
İnsanların bu soruyu tekrar tekrar sorduğu nokta, dokümantasyonda gerçekten iyi açıklanmadığıdır.
Michael Alan Huff

1
Hala hangi yöntemin kullanılacağını, sizin veya aşağıdaki yöntemi kullanacağım konusunda kafam karıştı @Elenasys
Yoann Hercouet

Mimari bileşenleri (I / O '17) kullanarak parçalar arasında veri paylaşmanın yeni bir yolu var: developer.android.com/topic/libraries/architecture/…
jpardogo

XML düzeninde oluşturulan parçalara ne dersiniz?
ralphgabb

Artık statik yöntem kullanmak istemiyorum.
Ahamadullah Saikat

89

Veri gönderme ActivityAFragment

Aktivite:

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

Fragment:

Değeri parça olarak okuma

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

Ancak Fragment'tan Aktiviteye değerler göndermek istiyorsanız, jpardogo'nun cevabını okuyun, arayüzlere ihtiyacınız var, daha fazla bilgi: Diğer Fragmanlarla iletişim kurmak


2
Özel bir nesne nasıl iletilir? Kullandım Parcelableama bu bana verdiclass cast exception
engerek

Bu çözüm benim için çalışmıyor, nereden ithalat yapacağını bulamıyorum
thebeancounter

Parçayı Etkinliğinize yüklerseniz, işleminizde tanımlanan paket aracılığıyla değerler gönderebilirsiniz. Senaryonuzun ne olduğunu açıklayın?
Jorgesys

8

@ ρяσѕρєя K ve Terry sayesinde ... bana çok yardımcı oluyor ve mükemmel çalışıyor

Etkinlik'ten şu şekilde veri gönderirsiniz:

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

ve Fragment onCreateView yönteminde:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

başvuru: Android'deki etkinlikten parçaya veri gönderme


7

Değişkeninizi ileri geri içerebilecek olayı iletmek için EventBus kitaplığını kullanın. İyi bir çözüm çünkü faaliyetlerinizi ve parçalarınızı gevşek bir şekilde bağlı tutar

https://github.com/greenrobot/EventBus


4
Bunun iyi bir çözüm olmadığını söyleyemem, ama bir dikkat uyarısı var. EventBus'un kullanımı son derece kolay olsa da, burada da tehlikesi vardır. Çok fazla sinyal eklemeye başlarsanız, gevşek bağlanmış doğa, kimin aradığını ve farklı olayların nerede gerçekleştiğini izlemeyi gerçekten zorlaştırabilir.
Johan Paul

2

Dışarıdaki tüm Kotlin geliştiricileri için:

İşte Fragmanınıza veri göndermek için Android Studio tarafından önerilen çözüm (= Dosya ile Boş Bir Parça oluşturduğunuzda -> Yeni -> Parça -> Parça (Boş) ve "parça fabrikası yöntemlerini dahil et" seçeneğini işaretlediğinizde).

Bunu Parçanıza koyun:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.applybir nesne oluşturulduğunda veya burada belirtildiği gibi verileri ayarlamak için iyi bir numaradır :

Belirtilen işlevi [block] thisdeğerini alıcı olarak çağırır ve thisdeğeri döndürür .

Ardından Faaliyetinizde veya Parçanızda şunları yapın:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

ve Parçanızdaki Bağımsız Değişkenleri aşağıdaki gibi okuyun:

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

Verileri tekrar Etkinliğinize "göndermek" için, Etkinliğinizde bir işlev tanımlamanız ve Parçanızda aşağıdakileri yapmanız yeterlidir:

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

Kotlin büyüsünün tadını çıkarın!


1

Etkinlikten XML ile bağlı Parçalara veri gönderme

Android Studio'da örneğin File> New> Fragment> Fragment (List) gibi şablonlardan birini kullanarak bir parça oluşturursanız, parça XML yoluyla bağlanır. NewInstance yöntemi parçada oluşturulur, ancak asla çağrılmaz, bu nedenle argümanlar iletmek için kullanılamaz.

Bunun yerine Etkinlik'te onAttachFragment yöntemini geçersiz kılar

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

Sonra diğer cevaplara göre onCreate parçasındaki parçacığı okuyun


0

Parçanızı bir demetle başlatabilirsiniz:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
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.