Yeni başlayanlar için, burada en çok yükselen 2 cevap arasındaki farkın bir parçanın farklı kullanımı ile verildiğini eklemek istiyorum.
Bu parçayı, geçmek istediğiniz verilerin bulunduğu java sınıfı içinde kullanırsanız, veriyi iletmek için ilk yanıtı uygulayabilirsiniz:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Ancak, sekmeli parçalar için Android Studio tarafından verilen varsayılan kodu kullanırsanız, bu kod çalışmaz.
Bu sizin FragmentClasses varsayılan PlaceholderFragment değiştirirseniz bile işe ve siz) GetItem (bir anahtar ekleyerek yeni bir durum) ve getPageTitle (başka anahtara FragmentPagerAdapter düzeltmek bile (gösterildiği gibi olmaz burada )
Uyarı: yukarıda belirtilen klibin burada daha sonra açıklayacağım kod hataları var, ancak varsayılan koddan sekmeli parçalar için düzenlenebilir koda nasıl geçtiğinizi görmek için yararlıdır)! Bu klipteki java sınıflarını ve xml dosyalarını (yeni başlayan bir senaryo tarafından sekmeli parçaların ilk kullanımı için temsilci) düşünürseniz, cevabımın geri kalanı çok daha mantıklı.
Bu sayfadan en çok oylanan yanıtın işe yaramamasının ana nedeni, sekmeli parçalar için varsayılan kodda, parçaların başka bir java sınıfında kullanılmasıdır: FragmentPagerAdapter!
Bu nedenle, verileri göndermek için MotherActivity'de bir paket oluşturup 2 no'lu cevabı kullanarak FragmentPagerAdapter içine iletebilirsiniz.
Sadece bu yine yanlış. ( Muhtemelen böyle yapabilirsin, ama bu gerçekten gerekli olmayan bir komplikasyon ).
Bunu yapmanın doğru / kolay yolu, bence, 2 numaralı cevabı kullanarak verileri doğrudan söz konusu parçaya aktarmaktır. Evet, Etkinlik ve Fragman arasında sıkı bir bağlantı olacaktır, ancak sekmeli fragmanlar için bu beklenen bir durumdur. Hatta MotherActivity java sınıfının içinde sekmeli fragmanlar oluşturmanızı bile tavsiye ederim (asla MotherActivity dışında kullanılmayacakları için alt sınıflar olarak) - kolaydır, sadece MotherActivity java sınıfının içine ihtiyacınız olduğu kadar çok Parça ekleyin:
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
Bu nedenle, MotherActivity'den böyle bir Fragmana veri aktarmak için, Ana faaliyetinizin onCreate'inin üstünde özel Dizeler / Paketler oluşturmanız gerekir; bunlar, parçalara aktarmak istediğiniz verileri doldurabilir ve bunları bir onCreate'den sonra oluşturulan yöntem (burada getMyData () olarak adlandırılır).
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
Ve sonra fragman sınıfında getMyData kullanın:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
Veritabanı sorgularınız varsa bunları MotherActivity'de yapmanızı öneririm (ve sonuçlarını yukarıda gösterildiği gibi bir paket içindeki tuşlara bağlı Dizeler / Tam Sayılar olarak iletirim), sekmeli parçaların içinde olduğu gibi, sözdiziminiz daha karmaşık hale gelir (bu getActivity olur) (), ve getIntent getActivity (). getIntent) olur, ancak istediğiniz gibi yapma seçeneğiniz de vardır.
Yeni başlayanlar için tavsiyem küçük adımlara odaklanmak. İlk olarak, HERHANGİ bir veri iletmeden çok basit bir sekmeli etkinlik açma niyetinizi alın. Çalışıyor mu? Beklediğiniz sekmeleri açar mı? Değilse, neden?
Bundan başlayın ve bu klipte sunulanlar gibi çözümler uygulayarak neyin eksik olduğuna bakın. Bu klip için mainactivity.xml hiçbir zaman gösterilmez. Bu kesinlikle sizi şaşırtacak. Ancak dikkat ederseniz, xml parça dosyalarında örneğin bağlamın (tools: context) yanlış olduğunu göreceksiniz. Her parça XML'inin doğru parça sınıfını (veya ayırıcı $ kullanarak alt sınıfı) işaret etmesi gerekir.
Ayrıca ana etkinlik java sınıfında tabLayout.setupWithViewPager (mViewPager) - TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs) satırından hemen sonra eklemeniz gerektiğini göreceksiniz; bu satır olmadan, görünümünüz aslında parçaların XML dosyalarına bağlı değildir, ancak SADECE ana etkinliğin xml dosyasını gösterir.
Ana etkinlik java sınıfındaki satıra ek olarak, ana etkinlik XML dosyasında sekmeleri durumunuza uyacak şekilde değiştirmeniz gerekir (örn. TabItems ekleme veya kaldırma). Ana etkinlik XML'sinde sekmeleriniz yoksa, ilk etapta oluşturduğunuzda muhtemelen doğru etkinlik türünü seçmediniz (yeni etkinlik - sekmeli etkinlik).
Son 3 paragrafta video hakkında konuştuğumu lütfen unutmayın! Yani ana aktivite XML dediğimde, videoda ana durum XML, sizin durumunuzda MotherActivity XML dosyası.