İkilem: Fragmanlar ve Etkinlikler ne zaman kullanılır:


785

Bunu biliyorum Activitiesederken, benim uygulamanın tek bir ekranı belirten tasarlanmıştır Fragmentsbunların mantığı gömülü içiyle yeniden UI düzenleri olacak şekilde tasarlanmıştır.

Çok geçmeden, geliştirilmeleri gerektiğini söylediği gibi bir uygulama geliştirdim. ActivityUygulamamın bir ekranını temsil etmek için bir oluşturdum ve ViewPagerveya için Parçalar kullandım Google Maps. Nadiren ListFragmentbirkaç kez tekrar kullanılabilen bir veya daha fazla kullanıcı arayüzü oluşturdum .

Son zamanlarda sadece 2 Activitiesbir SettingsActivityve diğer bir içeren bir proje üzerinde tökezledi MainActivity. Düzeni, MainActivitybirçok gizli tam ekran kullanıcı arabirimi parçasıyla doldurulur ve yalnızca bir tanesi gösterilir. Gelen Activitymantık çok var FragmentTransitionsuygulamanın farklı ekranlar arasında.

Bu yaklaşımla ilgili beğendiğim şey, uygulama bir kullandığı için ActionBarsağlam kalıyor ve ekran değiştirme animasyonu ile hareket etmiyor Activity. Bu, ekran geçişlerine daha akıcı bir his verir.

Bu yüzden sorduğum şey bu konuyla ilgili şu anki gelişim tarzınızı paylaşmak, ilk bakışta fikir tabanlı bir soru gibi görünebileceğini biliyorum ama buna bir Android tasarım ve mimari sorusu olarak bakıyorum ... görüş temelli.

GÜNCELLEME (2014/01/05): Bu sunumun ardından Eric Burke adlı Meydanı , (. I have to say android geliştiriciler için yararlı araçlar bir sürü harika bir sunum Ve Meydanı'na hiçbir şekilde ilgili değilim)

http://www.infoq.com/presentations/Android-Design/

Son birkaç aydaki kişisel deneyimimden, uygulamalarımı oluşturmanın en iyi yolunun, uygulamadaki bir akışı temsil eden ve tüm bu parçaları bir arada sunan parça grupları oluşturmak olduğunu buldum Activity. Temel Activitiesolarak uygulamanızda akış sayısı ile aynı sayıda olacaktır . Bu şekilde, eylem çubuğu tüm akış ekranlarında sağlam kalır, ancak çok anlamlı olan bir akışı değiştirerek yeniden yaratılır. Eric Burke'ün belirttiği gibi ve benim de fark ettiğim gibi, Activitiesmümkün olduğunca az kullanma felsefesi tüm durumlar için geçerli değildir, çünkü “Tanrı” etkinliği dediği şeyde bir karmaşa yaratır.


2
SO adresindeki yazıma göz atın - stackoverflow.com/questions/24647078/…
My God

Yanıtlar:


270

Uzmanlar size şunu söyleyecektir: "Kullanıcı arayüzünü gördüğümde, bir Activityveya bir kullanıp kullanmayacağımı bileceğim Fragment". Başlangıçta bunun bir anlamı olmayacak, ama zamanla, aslında ihtiyacınız olup olmadığını söyleyebileceksiniz Fragment.

Benim için çok yararlı bulduğum iyi bir uygulama var. Kızımla ilgili bir şeyler açıklamaya çalıştığımda başıma geldi.

Yani, bir ekranı temsil eden bir kutu düşünün. Bu kutuya başka bir ekran yükleyebilir misiniz? Yeni bir kutu kullanırsanız, 1. kutudan birden fazla öğe kopyalamanız gerekecek mi? Cevabınız Evet ise, o zaman kullanmalısınız Fragments, çünkü kök Activityonları kopyalarken size zaman kazandırmak için tüm yinelenen öğeleri tutabilir ve kutunun parçalarını değiştirebilirsiniz.

Ama unutma her zaman bir kutu kabı (gerektiğini Activity) veya parçalar dağılmış olacaktır. Yani içinde parçaları olan bir kutu.

Kutuyu yanlış kullanmamaya dikkat edin. Android UX uzmanları Activity, başka bir tane yüklememiz gerektiğinde Fragment(kategorileri olan Gezinme Çekmecesi ile uğraştığımız gibi ) öneride bulunur (bunları YouTube'da bulabilirsiniz ). Kendinizi rahat hissettiğinizde Fragments, tüm videolarını izleyebilirsiniz. Daha da fazlası zorunlu malzemelerdir.

Şu anda kullanıcı arayüzünüze bakıp bir Activityveya a ihtiyacınız olup olmadığını anlayabilir misiniz Fragment? Yeni bir bakış açısı kazandınız mı? Bence yaptın.


4
bahsettiğiniz youtube özet akışına bir bağlantınız var mı? "Android UX uzmanları" ve "Android UX" için arama yapıyorum, ancak hangi videolardan bahsettiğinizden tam olarak emin değilim.
ben--

2
Artık değil, bir yıl önce izledi. Android geliştirici resmi için UX hakkında konuşurken arayın
sandalone

1
Göz önünde bulundurulması gereken bir örnek: etkinlik parentActivity'ye sahiptir, bu nedenle bildirimden girerken backstack'i sentezleyebiliriz, ancak böyle bir parentFragment olduğunu düşünmüyorum.
fikr4n


@ToolmakerSteve evet getParentFragment, ama demek istediğim bu değil dostum, bkz. Developer.android.com/guide/topics/manifest/…
fikr4n

129

Benim felsefem şudur:

Yalnızca kesinlikle gerekli olması durumunda bir etkinlik oluşturun. Arka yığın parça işlemlerini gerçekleştirmek için kullanılabilir hale getirildiğinde, uygulamamda mümkün olduğunca az etkinlik oluşturmaya çalışıyorum. Ayrıca, çeşitli parçalar arasında iletişim kurmak, faaliyetler arasında ileri ve geri veri göndermekten çok daha kolaydır.

Faaliyet geçişleri pahalı, değil mi? En azından ben buna inanıyorum - eski aktivitenin yok edilmesi / duraklatılması / durdurulması, yığının üzerine itilmesi ve ardından yeni aktivitenin yaratılması / başlatılması / sürdürülmesi gerekiyor.

Parçalar tanıtıldığından beri sadece benim felsefem.


2
doğru, ancak yazdığınız gibi, bazen etkinlikleri kullanmak gerekir. bir örnek, yatay modda kullanmanın daha iyi olduğu bir kamera ekranıdır. başka bir örnek, özelleştirilmiş bir appWidget ("masaüstünde" - başlatıcı uygulaması) eklediğinizde gösterilen yapılandırma ekranıdır.
android geliştirici

Cevapladığınız ve deneyiminizi paylaştığınız için teşekkürler Yani uygulamayı bir Etkinlikle sınırlamak ve uygulama mimarisi izin veriyorsa tüm ekran için Fragment'ı kullanmak android için iyi bir uygulama olduğunu mu düşünüyorsunuz?
Emil Adz

1
O zaman birbirinden "devlet" geçmesi gereken fragmanlar sorununu nasıl çözersiniz? Tüm fragmanlarınızdaki tüm devletin tek bir aktivitede yaşaması gerekir, aksi takdirde bir singleton kullanmak zorunda kalırsınız.
Mr_E

36
Çeşitli parçalar arasında iletişim kurmanın, etkinlikler arasında veri göndermek yerine çok daha kolay olduğuna inanmıyorum.
Denny

3
En azından onActivityResult()parçaların geri aramalarından daha güvenli ve kolaydır.
CoolMind

59

Google'ın derslerine göre (belki de burada hatırlamıyorum), kodunuzun bakımını ve kontrolünü kolaylaştırdığı için mümkün olduğunda Parçayı kullanmayı düşünmelisiniz.

Bununla birlikte, bazı durumlarda, parçaların bulunduğu etkinliğin aralarında gezinmesi / iletişim kurması gerektiği için çok karmaşık olabileceğini düşünüyorum.

Bence senin için neyin en iyi olduğuna kendin karar vermelisin. Bir aktiviteyi bir parçaya dönüştürmek ya da tam tersi genellikle zor değildir.

Bu dillema hakkında bir yazı oluşturduk burada bazı başka okumak istiyorsanız.


5
Cevapladığınız ve deneyiminizi paylaştığınız için teşekkürler Yani uygulamayı bir Etkinlikle sınırlamak ve uygulama mimarisi izin veriyorsa tüm ekran için Fragment'ı kullanmak android için iyi bir uygulama olduğunu mu düşünüyorsunuz?
Emil Adz

Bu projeye bağlıdır, ancak sizin için çok karmaşık hale gelirse, birden fazla aktiviteye de ayırabilirsiniz. Herhangi bir yöntemi kullanmaktan korkmayın. İkisini de kullanabilirsiniz. Belki bazen aktiviteler yerine parçaları kullanmanız çok zor olabilir. Ben parçaları kullanmak denemek gerektiğini düşünüyorum, ama çok fazla yol alırsa her yerde olmaya zorlamayın ...
android geliştirici

ActionBar'ın bu etkisini korumak ve tüm içeriğin değiştirilmesini sağlamak istersem ne olur? Bunu Etkinlikler ile başarmak mümkün mü?
Emil Adz


27

Neden TÜM OLGULARDA Aktivite Parçası Tercih Ediyorum?

  • Etkinlik pahalıdır. Fragment'ta görünümler ve mülkiyet durumları ayrılır - bir fragman ne zaman backstackolursa, görüşleri yok edilir. Böylece Etkinlik'ten çok daha fazla Parça istifleyebilirsiniz.

  • Backstackmanipülasyonu. İle FragmentManager, tüm parçaları temizlemek kolaydır, parçaları ve etcs daha fazla eklemek. Ancak Etkinlik için, bu şeyleri manipüle etmek bir kabus olacaktır.

  • Çok öngörülebilir bir yaşam döngüsü . Ev sahibi Etkinliği geri dönüştürülmediği sürece. backstack içindeki parçalar geri dönüştürülmeyecektir. Bu nedenle, FragmentManager::getFragments()belirli bir Parçayı bulmak için kullanmak mümkündür (teşvik edilmez).


Merhaba, Frag over Act'ın avantajları hakkındaki yorumunuzu okudum, Github Repo'nuzda aynı şeyi göstermek için herhangi bir projeniz var mı?
Ümañg ßürmån

24

Jetpack'ten beri , Tek Etkinlik uygulaması tercih edilen mimaridir. Özellikle Gezinti Mimarisi Bileşeni ile kullanışlıdır .

kaynak


Bunun için teşekkür ederim!
Simão Garcia

1
Jetpack hakkında bugün ilk kez okudum. :) Parçalar tanıtıldığından beri tek etkinlik uygulamaları geliştiriyoruz. Çoklu aktivite çok daha karmaşıktır.
İnanılmaz Ocak

1
@TheincredibleJan Haklısın, Single Activity App mimarisi Jetpack'ten çok daha önce iyi bir çözümdü
Francis

12

Bence bu gerçekten alakalı değil. Dikkate alınması gereken anahtar faktör

  1. Kullanıcı arayüzünün bölümlerini ne sıklıkta yeniden kullanacaksınız (örneğin menüler),
  2. uygulama tabletler için de nedir?

Parçaların ana kullanımı, Tablet / Telefona duyarlı uygulamalar için mükemmel kılan çok kanallı etkinlikler oluşturmaktır.


Parçaların ana kullanımının, bunları özel görünümler olarak düşünmeden özel görünümler yapmak olduğunu söyleyebilirim. zaten olan da budur. Başlangıçta Google'dan tablete duyarlı uygulamalar yapmanın kullanışlı bir yolu olarak gösterildiğimiz için, isterseniz bunları farklı etkinliklere yapıştırabilirsiniz. bir görünüme daha fazla veya daha az kod eklemenin ve bunları istediğiniz yere yapıştırabilmenin (özel görünümler oluşturmadan) bir yolu.
Lassi Kinnunen

11

Bir etkinliğin uygulamanın niyetiyle paylaşılabilen ve başlatılabilen blok / bileşeni olduğunu unutmayın! Bu nedenle, uygulamanızdaki her etkinlik yalnızca bir tür görevi çözmelidir. Başvurunuzda sadece bir görev varsa, o zaman sadece bir etkinliğe ve gerekirse birçok parçaya ihtiyacınız olduğunu düşünüyorum. Tabii ki başka görevleri çözen gelecekteki etkinliklerde parçaları tekrar kullanabilirsiniz. Bu yaklaşım, görevlerin net ve mantıklı bir şekilde ayrılması olacaktır. Ayrıca, farklı fragman grupları için farklı niyet filtresi parametreleriyle bir etkinliği sürdürmenize gerek yoktur. Görevleri, geliştirme sürecinin tasarım aşamasında gereksinimlere göre tanımlarsınız.


Uygulamalarımızda aktivitenin bir tür görevi, farklı parçaları girmek için gezinme çekmecesini tutmaktır. :) Neden fragmanlar için niyetlerle uğraşmalıyım? Global veriler için "global" veri sınıfına statik bir referans tutmak ve bazı değerleri bir parçanın oluşturma örneği yöntemine aktarmak açık ve mantıklıdır.
İnanılmaz Ocak

9

Bunun farkında olduğunuzdan daha fazlası var, başlattığınız bir aktivitenin çağıran faaliyeti dolaylı olarak yok etmediğinden hatırlamanız gerekir. Elbette, kullanıcı bir sayfaya gitmek için bir düğmeyi tıklayacak, o sayfanın etkinliğini başlatacak ve geçerli olanı yok edecek şekilde ayarlayabilirsiniz. Bu çok fazla yüke neden olur. Size verebileceğim en iyi rehber:

** Yeni bir faaliyete yalnızca ana faaliyetin olması mantıklıysa ve bu etkinlik aynı anda açıksa (birden çok pencere düşünün) başlayın.

Birden fazla etkinliğe sahip olmanın ne zaman mantıklı olduğuna harika bir örnek Google Drive'dır. Ana etkinlik bir dosya gezgini sağlar. Bir dosya açıldığında, o dosyayı görüntülemek için yeni bir etkinlik başlatılır. Açılan belgeyi kapatmadan tarayıcıya geri dönmenize izin veren son uygulamalar düğmesine basabilir, hatta belki de birincisine paralel olarak başka bir belge açabilirsiniz.


Re "ana faaliyeti ve aynı zamanda (çoklu pencere düşünün) açık bu bir olması mantıklı yalnızca yeni bir aktivite başlatın." Ben öyle düşünmüyorum. Bu durum parçalar attach / detachyöntemler kullanılarak iyi çözülmüştür .
ToolmakerSteve

7

Yaptığım şey: Mümkünse daha az parça kullanmak. Ne yazık ki, neredeyse her durumda mümkündür. Böylece, bir sürü parça ve biraz etkinlikle karşılaşıyorum. Fark ettiğim bazı dezavantajlar:

  • ActionBar& Menü: 2 parçanın farklı başlığı, menüsü varsa, bu
    işlemesi zor olur. Örn: yeni parça eklerken, eylem çubuğu başlığını değiştirebilirsiniz, ancak backstackoradan açtığınızda eski başlığı geri getirmenin bir yolu yoktur. Bu vaka için her parçada bir Araç Çubuğuna ihtiyacınız olabilir, ancak inan bana, bu size daha fazla zaman harcayacak.
  • İhtiyacımız olduğunda startForResult, aktivite vardır, ancak parçalanmadı.
  • Varsayılan olarak geçiş animasyonunuz yok

Bunun için benim çözüm içeride bir parça sarmak için bir Etkinlik kullanmaktır . Bu yüzden ayrı eylem çubuğu, menü startActivityForResult, animasyon, ...


1
Çok faydalı noktalar, teşekkürler. " Bir parçayı sarmak için bir faaliyet " konusunu açıklığa kavuşturabilir misiniz ? Her parça için ayrı bir Etkinlik yaptınız mı? Eğer öyleyse, Fragment'a hiç ihtiyacınız var mı?
ToolmakerSteve

3
başlığı ve şeyleri geri yüklemenin bir yolu var. getSupportFragmentManager().addOnBackStackChangedListenerdinleyici eklemek için kullanın . o dinleyicide güncel parça olsun ve sonra başlık ve şeyler ayarlayın.
babay

4

fragmentAşırı aktivitenin bir büyük avantajı, fragman için kullanılan kodun farklı aktiviteler için kullanılabilmesidir. Bu nedenle, kodun uygulama geliştirmede tekrar kullanılabilirliğini sağlar .


3
Nasıl? Lütfen biraz örnek verebilir misiniz?
sofs1

1
@ sofs1 Sorunuz pek mantıklı değil. Bir fragmandaki herhangi bir kod, fragmanın hangi aktiviteden türetildiği fark etmeksizin aynı kalır.
İnanılmaz Ocak

@TheincredibleJan Ancak "İkinci etkinliğin hangi etkinlikten başlatıldığı önemli değil, bir etkinlikteki herhangi bir kod aynı kalır" diyemeyiz. Farkı görmüyorum.
iforce2d

3

ekran için fragment kullanmak fragmentiçin baz sağlamak için uygulama başına bir etkinlik kullanın fragments, lite ağırlıkactivites parçaları ile karşılaştırıldığında yeniden kullanılabilir parçaları hem telefon ve tablet destekleyen uygulama için daha uygundur


2

Bunlardan birini kullanmakta özgürsünüz.
Temel olarak, uygulamanız için hangisinin en iyi olduğunu değerlendirmeniz gerekir. İş akışını nasıl yöneteceğinizi ve veri tercihlerini nasıl depolayacağınızı / yöneteceğinizi düşünün.

Parçaların çöp verilerini nasıl sakladığını düşünün. Parçayı uyguladığınızda, parça (lar) ı doldurmak için bir aktivite köküne sahip olursunuz. Bu nedenle, çok fazla parça içeren çok sayıda etkinlik uygulamaya çalışıyorsanız, uygulamanızdaki performansı göz önünde bulundurmanız gerekir, çünkü iki bağlam yaşam döngüsünü manipüle ettiğinizden (kaba konuşuyor), karmaşıklığı unutmayın.

Unutmayın: fragman kullanmalı mıyım? Neden olmasın?

Saygılarımızla.


1

Daha iyi kullanıcı deneyimi için Parçalar kullanıyorum. Örneğin, bir Düğmeniz varsa ve çalıştırmak istediğinizde bir web hizmetini tıkladığınızda diyelim, üst Etkinliğe bir Parça ekliyorum.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

Bu şekilde kullanıcının başka bir etkinliğe taşınması gerekmez.

İkincisi, ben Fragmanları tercih ederim çünkü dönme sırasında kolayca kullanabilirsiniz.


Bu örneği daha iyi bir kullanıcı deneyimi haline getiren nedir? Bir aktivite ya da fragman yaptıklarını nasıl bilecekler (ya da umursacaklar)?
iforce2d

1

Gerçekten ne inşa etmek istediğinize bağlıdır. Örneğin navigation drawerparçaları kullanır. Sekmeler de kullanır fragments. Başka bir iyi uygulama, bir listview. Telefonu döndürdüğünüzde ve bir satırı tıkladığınızda etkinlik ekranın geri kalan yarısında gösterilir. Şahsen ben kullanıyorum fragmentsve fragment dialogsdaha profesyonel olduğu için. Ayrıca dönüşte daha kolay kullanılırlar.

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.