Android - Parça kimliğini ayarla


111

Kullanabilmem için a Fragment'yı nasıl ayarlayabilirim ?IdgetSupportFragmentManager().findFragmentById(R.id.--)


Düzen xml dosyasında ayarlayabilirsiniz
Vladimir Eremeev

Yanıtlar:


117

Bir parçanın kimliğini programlı olarak ayarlayamazsınız .

Bununla birlikte, String tagFragmentTransaction içinde ayarlayabileceğiniz ve bir Fragmanı benzersiz şekilde tanımlamak için kullanılabilecek bir şey vardır.

Aleksey belirttiği gibi, sen bir kimlik geçebilir FragmentTransactionbireyin add(int, Fragment)yöntemle. Ancak bu, bir Parçanın kimliğini belirtmez. İçine ViewGroupeklenecek a'nın kimliğini belirtir Fragment. Bu, sahip olmanızı beklediğim amaç için o kadar kullanışlı değil, çünkü benzersiz olarak Fragments'yi değil ViewGroups'yi tanımlıyor . Bu kimlikler, bir veya daha fazla parçanın dinamik olarak eklenebildiği kaplara aittir. 'Leri tanımlamak için böyle bir yöntemi kullanmak , her ekleyeceğiniz için Düzene dinamik olarak' ' eklemenizi gerektirir . Bu oldukça külfetli olur.FragmentViewGroupFragment

Dolayısıyla, sorunuz dinamik olarak eklediğiniz bir Parça için benzersiz bir tanımlayıcının nasıl oluşturulacağıysa, yanıt FragmentTransaction'ın add (int containerViewId, Fragment fragment, String etiketi) yöntemini ve FragmentManager' findFragmentByTag (String) yöntemini kullanmaktır.

Uygulamalarımdan birinde dinamik olarak dizeler oluşturmak zorunda kaldım. Ama yine de, gerçek FragmentTransaction'a göre o kadar pahalı değil.

Etiket yönteminin diğer bir avantajı, kullanıcı arayüzüne eklenmeyen bir Parçayı tanımlayabilmesidir. FragmentTransaction'ın add (Fragment, String) yöntemine bakın. Fragments gerek yok View! Yapılandırma değişiklikleri arasında geçici durumu sürdürmek için de kullanılabilirler!


Parça için kimliği değil etiketi kullanırsam, bir parça kaynak kimliğine ihtiyaç duyan değiştirme çağrısını nasıl kullanırım?
Namratha

12
@TomDignan, bir ViewPager'a eklenecek bir parçaya ne dersiniz? Etiketini nasıl ayarlayabilirim? Bu durumda işlemleri kullanamam.
Guilhe

1
@GuilhE Activity, viewpager'dan başvurabileceğiniz bir addFragment () yöntemi sağlar. Etiketi bundan önce tutmak, bir hashmap ile gerçekleştirilebilir.
Thomas Dignan

1
Yanıt, xml düzeninde id ayarlayabileceğinizi vurgulamak için biraz düzenlenebilir mi? Şahsen başka soruları okumadığım ve parçanın kimliğini belirlemenin hiçbir yolu olmadığı izlenimine
Ivan

41

Parça kimliğini bilmenize gerek kalmayabilir.

Dokümanlardan:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

Önemli kısım, "bir işleme eklendiğinde konteyner kimliği olarak".

yani:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

ve sonra

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

R.id.fragment_holder'da tutulan (harika) parçayı size verecektir.


4

Çoğu durumda, parça etiketinin yanı sıra kimliği de kullanabilirsiniz.
Etiket değerini içinde ayarlayabilirsiniz FragmentTransaction.add(Fragment fragment, String tag );. Ardından FragmentManager.findFragmentByTag(String tab), söz konusu parçayı bulmak için komutu kullanabilirsiniz .


2

Tom ve diğerlerinin daha önce bahsettiği gibi, bir parçaya etiket koymanın ve bu etiketi tanımlama için kullanmanın yolları vardır. Bu çözümlerle karşılaştığım sonraki bir sorun, parçanın Aktivite (veya aslında FragmentManager) ile ilişkilendirilene kadar bir etiket almamasıdır . Bir parçanın etiketlenmeden önce tanımlanması gerekirse ne yapmalı?

Şimdiye kadarki çözümlerim, dünyadaki en eski (Java) numarasına dayanıyor: yapıcılarından birinde bir kimliği alan ve getFragmentId()bu kimliği döndüren bir yöntem sağlayan minimalist bir şablon parçası oluşturun . Daha sonra, erken tanımlamaya ihtiyaç duyan parçaların bu şablonu genişletmesine izin veriyorum ve; işte! Sorun çözüldü.

Bu çözüm kudreti maalesef şablon parçaları her fragman türü için biri bir dizi gerektirir ListFragment, DialogFragmentya da eski düz Fragmenterken belirlenmesini gerek (POFO ?!). Ancak, sağlanan kazanımlar göz önüne alındığında, bence bu, parçalar durumunda yönetilebilir.

İyileşen yaraları yırttığım için üzgünüm :-)

Şerefe!


0

Aşağıdakileri kullanın:

Bir parça eklemek için:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

Mevcut parçayı tanımlamak için:

getFragmentManager().findFragmentByTag(fragmentName);

Cevap soru ile alakalı değil. Lütfen yanıtı güncelleyin. Happy Coding
CodeWithVikas

-1

Bir etiketi kullanırken lütfen eklediğinizden emin olun.

fragmentTransaction.addToBackStack(null); 

geliştirici kılavuzlarında belirtildiği gibi Parçanızın imha edilmesi yerine devam ettirilmesi için yöntem.

Bir parçayı kaldıran bir işlem gerçekleştirdiğinizde addToBackStack () öğesini çağırmazsanız, işlem tamamlandığında bu parça yok edilir ve kullanıcı ona geri dönemez. Oysa, bir parçayı kaldırırken addToBackStack () öğesini çağırırsanız, parça durdurulur ve daha sonra kullanıcı geri dönerse devam ettirilir.

Bunu bu sayfanın sonunda bulabilirsiniz .

Parçamın neden basit bir findFragmentByTag();aramayla bulunamadığını anlamaya çalışırken yaklaşık 30 dakika kaybettim


-2

Tom'un cevabına ek olarak, değiştirme yöntemi, ekleme yöntemine ek olarak parça etiketini de destekler.

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.