Neden fragmanlar ve aktiviteler yerine fragmanlar ne zaman kullanılır?


484

Android API 11+ sürümünde Google adlı yeni bir sınıf yayınladı Fragment.

Videolarda Google, mümkün olduğunda ( link1 , link2 ) etkinlikler yerine fragmanlar kullanmamız gerektiğini, ancak tam olarak nedenini açıklamadıklarını öne sürüyor .

Parçaların amacı ve bunların bazı olası kullanımları nedir (basit görünümler / düzenlerle kolayca elde edilebilecek bazı UI örnekleri dışında)?

Benim sorum fragmanlar hakkında:

  1. Bir parçayı kullanmanın amaçları nelerdir?
  2. Etkinlik / görünüm / düzen kullanma ile karşılaştırıldığında fragman kullanmanın avantajları ve dezavantajları nelerdir?

Bonus sorular:

  1. Parçalar için gerçekten ilginç kullanımlar yapabilir misiniz? Google'ın videolarında bahsetmediği şeyler?
  2. Parçalar ve bunları içeren faaliyetler arasında iletişim kurmanın en iyi yolu nedir?
  3. Parça kullandığınızda hatırlamanız gereken en önemli şeyler nelerdir? Deneyiminizden ipuçları ve uyarılar var mı?


Yanıtlar:


282

# 1 & # 2 Bir fragman kullanmanın amaçları nelerdir ve fragman kullanmanın aktivite / görünüm / düzen kullanma ile karşılaştırıldığında avantaj ve dezavantajları nelerdir?

Parçalar, yeniden kullanılabilir kullanıcı arayüzleri oluşturmak için Android'in çözümüdür. Aynı şeylerden bazılarını etkinlikler ve düzenler kullanarak da elde edebilirsiniz (örneğin, ekleme özelliğini kullanarak). Ancak; fragmanlar Android API'ye, HoneyComb ve daha fazlasına bağlanır. Açıklayayım;

  • ActionBar. Yukarıdaki sekmelerin uygulamanızda gezinmesini istiyorsanız, ActionBar.TabListenerarayüzün size yönteme FragmentTransactionbir giriş argümanı olarak a verdiğini hızlı bir şekilde görürsünüz onTabSelected. Muhtemelen bunu görmezden gelebilir, başka bir şey ve akıllıca yapabilirsiniz, ancak API ile değil, API ile çalışacaksınız.

  • FragmentManagerÇok akıllı bir şekilde sizin için tutamak «geri». Geri dönmek, normal faaliyetlerde olduğu gibi son faaliyete geri dönmek anlamına gelmez. Önceki parça durumuna geri dönüyor.

  • Kaydırma arayüzleri oluşturmak için soğutmayı a ViewPagerile kullanabilirsiniz FragmentPagerAdapter. FragmentPagerAdapterKodunu düzenli adaptör çok daha temiz olduğunu ve bireysel parçaların instantiations kontrol eder.

  • Hem telefonlar hem de tabletler için uygulamalar oluşturmaya çalıştığınızda Parçalar'ı kullanırsanız hayatınız çok daha kolay olacaktır. Parçalar Honeycomb + API'leriyle bu kadar bağlantılı olduğundan, kodu yeniden kullanmak için bunları telefonlarda da kullanmak isteyeceksiniz. Uyumluluk kütüphanesi işte burada devreye girer.

  • Sadece telefonlara yönelik uygulamalar için parçalar bile kullanabilirsiniz ve kullanmalısınız. Aklınızda taşınabilirlik varsa. ActionBarSherlockSürüm 1.6'ya kadar aynı görünen "ICS görünümlü" uygulamalar oluşturmak için ve uyumluluk kitaplıklarını kullanıyorum . ActionBarSekmeler, taşma, bölünmüş eylem çubuğu, viewpager vb. İle en son özellikleri alırsınız.

Bonus 2

Parçalar arasında iletişim kurmanın en iyi yolu niyetlerdir. Bir Fragmandaki bir şeye bastığınızda, genellikle StartActivity()üzerindeki verilerle arama yaparsınız . Amaç, başlattığınız aktivitenin tüm parçalarına aktarılır.


5
her şeyden önce, teşekkürler. bilgilendirici (henüz kısa) cevaplar veren insanları takdir ediyorum ve sadece bir el kitabına bir bağlantı vermekle kalmıyor, ayrıca özel sınıflarda çalışmak için ekstra özelliklerin yanı sıra, parçalarla çalışmanın avantajlarını ve dezavantajlarını da düşünebilirsiniz. ?
android geliştirici

4
Sanırım sorgulamada daha doğrudan olmalısın. Yukarıda dört ana avantaj sağladım.
Glenn Bech

2
tamam, özelleştirilmiş görüşler ve etkinliklerle karşılaştırıldığında dezavantajlar ne olacak?
android geliştirici

2
amaçları kullanarak fragmanlar arasında nasıl iletişim kurarsınız? birbirleriyle iletişim kurabilmeleri için tüm parçaların "canlı" (etkinliğe eklenmiş) olması gerekir mi?
android geliştirici

55
Bir fragman asla doğrudan başka bir fragmanla konuşmamalıdır - bunun yerine ebeveyn aktivitesinden geçin. Bu şekilde spagetti koduyla değil, yönetilmesi kolay kodla sonuçlanırsınız.
slott

70

Hangi videolardan bahsettiğinizden emin değilim, ancak aktiviteler yerine parçaları kullanmanız gerektiğini söylediklerinden şüpheliyim, çünkü bunlar doğrudan değiştirilemez. Aslında Geliştirici Kılavuzu'nda oldukça ayrıntılı bir giriş var, ayrıntılar için okumayı düşünün.

Kısacası, fragmanlar aktivitelerin içinde yaşar ve her aktivite birçok fragmana ev sahipliği yapabilir. Faaliyetler gibi, belirli bir yaşam döngüsüne sahiptirler, faaliyetlerin aksine, üst düzey uygulama bileşenleri değildirler. Parçaların avantajları arasında, kodun yeniden kullanımı ve modülerliği (örn., Birçok aktivitede aynı liste görünümünü kullanma), çok bölmeli arayüzler oluşturma yeteneği (çoğunlukla tabletlerde faydalıdır) bulunur. Ana dezavantaj (bazı) ilave karmaşıklıktır. Aynı şeyi (özel) görünümlerle standart olmayan ve daha az sağlam bir şekilde elde edebilirsiniz.


1
güncellenmiş soru. artık google'ın videolarına bağlantılar var. Ayrıca, açıklama için teşekkürler, ama yine de sorum hakkında açıklamaya ihtiyacım var.
android geliştirici

5
Geliştirici kılavuzu girişini okuyun, fazlasıyla detayı var. SO - belirsiz yol üzerinde 'parçaların serin kullanımları' için bir cevap almanız pek olası değildir ve tek bir cevap yoktur. 4 numara, geliştirici
Nikolay

1
bildiğim kadarıyla, bu yöntem hangi aktivitenin hangi parçayı içerebileceğine bağımlılık yaratır. ayrıca, lütfen ana soruları cevaplayın (ilk ikisi).
android geliştirici

3
Temel sorunun cevaplarında ısrar ettiği için android geliştiricisine teşekkürler. ATM XML "include" etiketi kullanarak Fragment sınıfında benim için yararlı bir şey görmedim. Değerli bulacağım şeyler, tüm çözünürlüklerde sihirli bir şekilde en iyi kullanıcı deneyimine dönüşecek bir düzen belirleme yeteneği olacaktır. Söyleyebileceğim kadarıyla bunu kodda kendiniz yapmanız gerekiyor. Başka bir potansiyel değer, kodu + kaynakları yeniden kullanılan uygulamalarda bulunmayan yeniden kullanılabilir bileşenlerde bir araya getirmenin bir yolu olabilir, ancak yine orada görünmüyor. Gerçekten iyi bir sebep istiyorum.
Melinda Green

2
Google'ın parçaları kullanma şeklini anlamaya başlıyorum, ancak @NikolayElenkov ile oldukça katılıyorum .. Bana göre, Etkinlikler'i kullanmak hala en sağlam ve daha az karmaşık bir yol gibi görünüyor ..
andrea.rinaldi

49

Parça, bir uygulamanın kullanıcı arabiriminin veya davranışının, daha modüler bir etkinlik tasarımı sağlayan bir Etkinliğe yerleştirilebilecek bir parçasıdır. Bir parçanın bir tür subaktivite olduğunu söylesek yanlış olmaz.

Bir parça hakkında önemli noktalar şunlardır:

  1. Bir parçanın, kendi yaşam döngüsü geri çağrıları ile kendi düzeni ve kendi davranışı vardır.

  2. Etkinlik çalışırken bir etkinliğe parça ekleyebilir veya kaldırabilirsiniz.

  3. Çok bölmeli kullanıcı arayüzü oluşturmak için birden fazla parçayı tek bir etkinlikte birleştirebilirsiniz.

  4. Bir fragman birden fazla aktivitede kullanılabilir.

  5. Parça yaşam döngüsü, konakçı aktivitesinin yaşam döngüsü ile yakından ilişkilidir.

  6. Aktivite duraklatıldığında, aktivitede mevcut olan tüm fragmanlar da durdurulacaktır.

  7. Bir parça, kullanıcı arabirimi bileşeni olmayan bir davranış uygulayabilir.

  8. Parçalar, API sürüm 11 ile Android 3'te (Honeycomb) Android API'sine eklendi .

Daha fazla bilgi için lütfen resmi web sitesi Fragments'ı ziyaret edin .


1. # 8'de bahsettiğiniz gibi, bir düzene sahip olması gerekmez. 6. "demek" sonra parçayı kaçırdınız. Her neyse, başkalarının bunu daha net hale getirmesine yardımcı olduğunuz için teşekkürler. Sana +1 vereceğim.
android geliştirici

1
# 8 ile ilgili olarak, mizanpajsız parçanın (örn. 'Başsız' parça) olası bir örneği, yapılandırma değişikliklerinden kurtulmak için biraz kısa olmasına rağmen (kısa bir HTTP isteği gibi) hala gerekli olan bir görevi yerine getiren bir görev olacaktır. üzerinde tam olarak korunan parça örneğinde (parça üzerinde setRetainInstance (true) kullanarak). Düzen parçalarına gelince, setRetainInstance (true), görünümleriyle ilişkili kaynakların gerektiğinde serbest kalmasını önlediğinden (yani bir bellek sızıntısı) çok mantıklı değildir.
Piovezan

NOT: "# 8" artık "# 7" dir.
ToolmakerSteve

21

Bu, fragmanlarda bulduğum önemli bilgiler:

Tarihsel olarak bir Android uygulamasındaki her ekran ayrı bir Etkinlik olarak uygulandı. Bu, ekranlar arasında bilgi aktarımında bir zorluk yaratır çünkü Android Intent mekanizması, bir referans türünün (yani nesne) doğrudan Etkinlikler arasında geçirilmesine izin vermez. Bunun yerine, nesnenin serileştirilmesi veya genel olarak erişilebilir bir referans olması gerekir.

Her ekranı ayrı bir Fragman haline getirerek, baş ağrısından geçen bu veri tamamen önlenir. Parçalar her zaman belirli bir Faaliyet bağlamında bulunur ve bu Faaliyete her zaman erişebilir. İlgilenilen bilgileri Etkinlik içinde saklayarak, her ekran için Parça, Etkinlik yoluyla nesne referansına erişebilir.

Kaynak: https://www.pluralsight.com/blog/software-development/android-fragments


3
Bu doğru, ancak bunun için çözümler var: Büyük bir nesne olmadığında Parcelable kullanın (ve daha kolay hale getirmek için bir eklenti var) ve büyük bir nesne ise, her zaman null olarak ayarlanacak statik bir referans kullanabilirsiniz yeni etkinliğe ulaştığınızda (veya gereksiniminize bağlı olarak onu yok ettiğinizde).
android geliştirici

@androiddeveloper: "Parcelable kullan" ifadesi, "Parçalar kullanarak kaçınılan veri başağrısı" tanımımla uyumlu. Bir dizi ekran geçerken devam etmesi gereken karmaşık bir paylaşılan durum varsa, Etkinlik + Parçalar iyi bir çözümdür, IMHO. (Gerçi Fragment arka yığınını terk ettim ve "geri" nin ne anlama geldiğini kendi yönetimimi yaptım.)
ToolmakerSteve

Bir kap etkinliği aracılığıyla parçalar arasında arayüz tasarım deseni kullanmak, yalnızca nesneleri değil, aynı zamanda tıklama dinleyicilerini ve yöntem argümanlarını diğer parçalara veya ana kap etkinliğine geri aktarmak için çok modüler bir yaklaşımdır.
Kaveesh Kanwal

10

Faaliyetler araç çubuğu ile app tam ekran bileşenler, diğer her şey tercihen Fragmanlar. Araç çubuğuna sahip bir tam ekran üst etkinliği, hepsine üst öğeden erişilebilen ve üst öğeyle iletişim kurabilen birden çok bölme, kaydırılabilir sayfa, iletişim kutusu vb. (Tüm parçalar) olabilir.

Misal:

Etkinlik A, Etkinlik B, Etkinlik C:

  • Tüm etkinliklerin aynı kodu tekrar etmesi, örneğin temel bir araç çubuğunu göstermesi veya bir üst etkinliğinden miras alması gerekir (yönetmek zor olur).
  • Bir aktiviteden diğerine geçmek için ya hepsinin hafızada (tepede) olması ya da birinin diğerinin açılması için yok edilmesi gerekir.
  • Etkinlikler arasındaki iletişim Amaçlar aracılığıyla yapılabilir.

vs

Etkinlik A, Parça 1, Parça 2, Parça 3:

  • Kod tekrarı yok, tüm ekranların bu etkinlikten araç çubukları vb.
  • Bir parçadan diğerine geçmenin çeşitli yolları - çağrı cihazı, çoklu bölme vb.
  • Etkinlik en fazla veriye sahiptir, bu nedenle minimum parçalararası iletişim gereklidir. Hala gerekliyse, arayüzler üzerinden kolayca yapılabilir.
  • Parçaların tam ekran olması gerekmez, onları tasarlarken çok fazla esneklik sağlar.
  • Görünümler gerekli değilse parçaların düzeni şişirmesi gerekmez.
  • Birkaç aktivite aynı parçayı kullanabilir.

mükemmel cevap!
Sathesh

8

Parçalar, tüm sayfalarımızda bir gezinme çekmecesini tutmak istediğimiz gibi bazı durumlarda özellikle kullanılır. Bir çerçeve düzenini istediğiniz parçayla şişirebilir ve yine de gezinme çekmecesine erişebilirsiniz.

Bir etkinlik kullandıysanız, çekmeceyi yedek kod gerektiren tüm etkinliklerde tutmanız gerekirdi. Bu, bir parçanın ilginç bir kullanımıdır.

Android'de yeniyim ve hala bir parçanın bu şekilde yardımcı olduğunu düşünüyorum.


Evet. Bununla birlikte, hala bazen parçaları kullanmanın doğru yolu hakkında kafam karıştı ve bunun nedeni hem parçaların hem de aktivitelerin karmaşık yaşam döngüsü.
android geliştirici

@androiddeveloper sadece etkinlikleri çoğunlukla kullanıyor musunuz?
Michael Alan Huff

@MichaelAlanHuff Tabletleri desteklerken, Parçacıklar kullanmanın daha iyi olduğunu düşünüyorum. Ayrıca, yönlendirme değişikliklerini ve diğer benzer etkinlikleri desteklerken, onları geri yüklemenize izin verdiği için DialogFragment'ı kullanmak isteyebilirsiniz
android geliştirici

@androiddeveloper, ben de öyle düşünüyorum. DialogFragments'ı çok sık kullanmadım. Mantık modülerliğine yardımcı olmak için, bir çok android geliştiricisi mantığı bir kare havan tutmak için özel görünümler kullanmaya başlıyor. İşte Airbnb'den bir mühendis tarafından verilen özel görünümler üzerine son bir konuşma vimeo.com/127799187
Michael Alan Huff

@MichaelAlanHuff, mevcut ekranın başka bir ekranın parçası olabileceğini düşünüyorsanız, yararlı parçaları da kullanabilirsiniz.
android geliştirici

5

Bunun zaten ölümle tartışıldığını biliyorum, ama biraz daha puan eklemek istiyorum:

  • Frags Menus doldurmak için kullanılabilir ve MenuItemkendi başlarına tıklama işleyebilir . Böylece Faaliyetleriniz için daha fazla modülasyon seçeneği sunar. Etkinliğiniz hakkında bilgi sahibi olmadan ContextualActionBar öğelerini ve benzerlerini yapabilirsiniz ve temel olarak Etkinlik'in işlediği temel öğelerden (Gezinme / Ayarlar / Hakkında) ayrıştırabilirsiniz.

  • Alt Frags'lı bir üst Frag, bileşenlerinizi modüle etmek için size daha fazla seçenek sunabilir. Frags'i kolayca takas edebilir, bir Çağrı Cihazının içine yeni Frags koyabilir veya kaldırabilir, yeniden düzenleyebilirsiniz. Aktiviteniz olmadan, sadece üst düzey şeylere odaklanan bir şey bilmiyorsunuz.


0

Fragmanlar Faaliyet içinde yaşar ve şunlara sahiptir:

  • kendi yaşam döngüsü
  • kendi düzeni
  • kendi çocuk parçaları vb.

Fragmanları ait olduğu ana faaliyetin bir alt faaliyeti olarak düşünün, kendi başına var olamaz ve tekrar tekrar çağrılabilir / tekrar kullanılabilir. Bu yardımcı olur umarım :)


Aslında, ikinci nokta hakkında ("kendi düzeni"), bu isteğe bağlıdır. Bir parçanın hiç bir görüşe sahip olması gerekmez.
android geliştirici

0

1.Bir fragman kullanmanın amaçları?

  • Ans:
    1. Cihaz form faktörü farklılıkları ile başa çıkmak.
    2. Uygulama ekranları arasında bilgi aktarımı.
    3. Kullanıcı arayüzü organizasyonu.
    4. Gelişmiş kullanıcı arayüzü metaforları.

0

Bir aktivite bir aktivitenin içinde yaşarken, bir aktivite kendi başına yaşar.


6
"kendi başına" mı? Belki "kendi başına"? Yoksa "kendi başına" mı?
Peter Mortensen
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.