Etkinlik, AppCompatActivity, FragmentActivity ve ActionBarActivity: Hangisi Ne Zaman Kullanılmalı?


266

İOS'tan geliyorum ve sadece bir UIViewController kullanıyorsunuz. Bununla birlikte, Android'de, belirli API Seviyeleri için belirli UIComponents ile işler çok daha karmaşık görünüyor. Android için BigNerdRanch okuyorum (kitap kabaca 2 yaşında) ve Activityev sahipliği yapmamı önerirler FragmentActivities. Ancak Activityreddedildiğini düşündüm .

API Seviye 22 için (API Seviye 15 veya 16 için minimum destekle), hem bileşenleri barındırmak için hem de bileşenler için tam olarak ne kullanmalıyım? Tüm bunların kullanımları var mı yoksa neredeyse bir veya iki tane mi kullanmalıyım?


1
Ev sahipliği yapmayacaksınız FragmentActivity. Yalnızca ev Fragmentsahipleriniz var. Daha yeni Android sürümlerinde, Activitysınıfın kendisi bunları doğrudan barındıracak şekilde güncellendi. Eski sürümleri desteklemek FragmentActivityiçin tanıtıldı.
Ravi Thapliyal

5
Benzer şekilde, API 11+ ile Activitybir ActionBar. Bu, ActionBarActivityilk kullanımdan kaldırılmış ve yerine eski sürümlerde desteklenmiştir AppCompatActivity. Beri, bu sınıfların her ikisi de FragmentActivitybarındırma Fragments destek uzatmak .
Ravi Thapliyal

Yanıtlar:


327

Etkinliğin kullanımdan kaldırıldığını düşündüm

Hayır.

API Seviye 22 için (API Seviye 15 veya 16 için minimum destekle), hem bileşenleri barındırmak için hem de bileşenler için tam olarak ne kullanmalıyım? Tüm bunların kullanımları var mı yoksa neredeyse bir veya iki tane mi kullanmalıyım?

Activitytemeldir. Her etkinlik Activitydoğrudan veya dolaylı olarak miras alır .

FragmentActivitysupport-v4ve support-v13kütüphanelerinde bulunan parçaların backport'u ile kullanım içindir . Parçaların yerel uygulaması, önerilen minSdkVersiondeğerlerinizden daha düşük API Düzey 11'e eklenmiştir . Özellikle dikkate almanızın tek nedeni FragmentActivity, iç içe fragmanları (başka bir fragmanı tutan bir fragman) kullanmak istiyorsanız, API Seviye 17'ye kadar yerel fragmanlarda desteklenmediğidir.

AppCompatActivitydan appcompat-v7kütüphanede. Prensip olarak, bu işlem eylem çubuğunun bir backport'unu sunar. Yerel işlem çubuğu API Seviye 11'e eklendiğinden, buna gerek yoktur AppCompatActivity. Bununla birlikte, mevcut sürümleri appcompat-v7, eylem çubuğu ve çeşitli widget'lar açısından Malzeme Tasarımı estetiğinin sınırlı bir sırtını da ekler. appcompat-v7Bu özel Stack Overflow cevabının kapsamının çok ötesinde, kullanmanın artıları ve eksileri vardır .

ActionBarActivityadlı temel etkinliğin eski adıdır appcompat-v7. Çeşitli nedenlerle adını değiştirmek istediler. Kullandığınız bazı üçüncü taraf kütüphane bir ısrar sürece ActionBarActivity, tercih etmelidir AppCompatActivityüzerinde ActionBarActivity.

Yani, minSdkVersion15-16 aralığında sizin verilen :

  • Desteklenen Materyal Tasarımı görünümünü istiyorsanız, AppCompatActivity

  • Değilse, ancak iç içe geçmiş parçalar istiyorsanız, FragmentActivity

  • Değilse, kullanın Activity

Sadece not olarak yorumdan ekleme: AppCompatActivitygenişletir FragmentActivity, böylece özelliklerini kullanması gereken herkes FragmentActivitykullanabilir AppCompatActivity.


Materyal Tasarımı görünümünü kullanmak ve iç içe geçmiş parçalar kullanmak istersem ne olur? AppCompatActivity, FragmentActivity'den miras alıyor?
Orcun Sevsay

4
@MiloRambaldi: Evet, FragmentActivityatasıdır AppCompatActivity. İç içe fragmanların kullanılmasını önermememe rağmen, iç içe fragmanların hiç çalıştığı ölçüde, iç içe fragmanları AppCompatActivitydestekleyecektir.
CommonsWare

@CommonsWare'nin ayrıntılı cevabı için teşekkürler. Hangi minSDK'nın Activityen yeni özelliklerin çoğunu desteklenmeyen support-v7Malzeme Tasarımı olmadan kullanmanıza izin vereceğini söyleyebilir misiniz? Amacım min 19 hedef 25
jugutier

1
@jugutier: Kullanmak için 21 veya daha üstüne Theme.Materialihtiyacınız var minSdkVersion.
CommonsWare

83

Activitydiğer tüm aktivitelerin temel sınıfıdır, kullanımdan kaldırılacağını sanmıyorum. Aralarındaki ilişki:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' burada kalıtım anlamına gelir. Referans bahsedilen ActionBarActivitykullanımı kaldırıldı AppCompatActivityyerine.

Temel olarak, kullanmak AppCompatActivityher zaman doğru seçimdir. Aralarındaki farklar:

  • Activity temel olanıdır.
  • Dayanarak Activity, FragmentActivitykullanma yeteneği sağlar Fragment.
  • Dayanarak FragmentActivity, AppCompatActivityözellikleri sağladığı ActionBar.

2
zarif cevap.
M.kazem Akhgary

69

2019: Kullanım AppCompatActivity

Bu yazı yazılırken (hala doğru olduğunu onaylamak için bağlantıyı kontrol edin), Android BelgeleriAppCompatActivity bir Uygulama Çubuğu kullanıyorsanız kullanılmasını önerir .

Bu rasyoneldir:

Android 3.0'dan (API düzey 11) başlayarak, varsayılan temayı kullanan tüm etkinliklerde uygulama çubuğu olarak bir ActionBar bulunur. Bununla birlikte, uygulama çubuğu özellikleri, çeşitli Android sürümleri üzerinde yerel ActionBar'a kademeli olarak eklenmiştir. Sonuç olarak, yerel ActionBar, bir cihazın kullanıyor olabileceği Android sisteminin sürümüne bağlı olarak farklı davranır. Bunun aksine, en yeni özellikler destek kitaplığının Araç Çubuğu sürümüne eklenir ve destek kitaplığını kullanabilen tüm cihazlarda kullanılabilir.

Bu nedenle, etkinliklerinizin uygulama çubuklarını uygulamak için destek kitaplığının Araç Çubuğu sınıfını kullanmalısınız. Destek kitaplığının araç çubuğunu kullanmak, uygulamanızın en geniş cihaz yelpazesinde tutarlı bir davranışa sahip olmasını sağlar. Örneğin, Araç Çubuğu widget'ı Android 2.1 (API düzey 7) veya sonraki sürümlerini çalıştıran cihazlarda malzeme tasarım deneyimi sağlar, ancak cihaz Android 5.0 (API düzey 21) veya sonraki sürümlerini çalıştırmadığı sürece yerel eylem çubuğu malzeme tasarımını desteklemez.

Araç Çubuğu eklemenin genel talimatları

  1. V7 appcompat destek kitaplığını ekleme
  2. Tüm faaliyetlerinizi genişletin AppCompatActivity
  3. Manifest'te istediğinizi beyan edin NoActionBar.
  4. ToolBarHer etkinliğin xml düzenine bir ekleyin .
  5. ToolBarHer etkinlikte alın onCreate.

Daha fazla bilgi için dokümantasyon talimatlarına bakın. Onlar oldukça açık ve yararlı.


Merhaba @Suragch, bunun için teşekkürler. Bugün YALNIZCA 21 yaşın üzerinde bir uygulama yaptığımı varsayalım. Aslında, olduğu gibi, bir eylem çubuğu veya uygulama çubuğu (tam ekran uygulamasının daha fazlası) istemiyorum. Studio (16 Kasım) "Geriye dönük uyumluluk (AppCompat)" kullanabileceğimi öneriyor . Benim içgüdüm AppCompat kullanmayın. Uzman görüşünüz nedir? Sadece sana teşekkür edebilirim, teşekkürler.
16:15 Fattie

Ben bir uzman değilim, bu yüzden size bir uzman görüşü veremem, ancak belgelerde yapabildiğim kadar çok cihazı desteklemeyi öneriyorum. AppCompat'ı tüm uygulamalarımla kullanıyorum ve şimdiye kadar iyi çalıştı. Sanırım 21 öncesi gerçekten desteklemek istemiyorsanız Studio önerisini göz ardı edebilirsiniz.
17'de Suragch

50

Minimum 15 API düzeyi için kullanmak istersiniz AppCompatActivity. Örneğin, MainActivityşöyle görüneceksin:

public class MainActivity extends AppCompatActivity {
    ....
    ....
}

Kullanmak AppCompatActivityiçin Google Destek Kitaplığı'nı indirdiğinizden emin olun (bunu Araçlar -> Android -> SDK yöneticinizden kontrol edebilirsiniz). Ardından, uygulamanızın gradle.build dosyasına not bağımlılığını eklemeniz yeterlidir:

compile 'com.android.support:appcompat-v7:22:2.0'

Bunu AppCompatana parça olarak kullanabilirsiniz Activity, daha sonra Parçalar veya diğer Faaliyetleri başlatmak için kullanılabilir (bu, ne tür bir uygulama oluşturduğunuza bağlıdır).

BigNerdRanch kitabı iyi bir kaynak, ama evet, modası geçmiş. Android'in nasıl çalıştığı hakkında genel bilgi için okuyun, ancak kullandıkları belirli sınıfların güncel olmasını beklemeyin.


Tamam, gradle.build dosyamda bu bağımlılık var. Yani, örneğin, bir grup satır içeren bir tablo yapıyorsam (herhangi bir Notes uygulaması gibi), ana ekranım bir AppCompat olacak ve aynı zamanda ana bilgisayarların bir AppCompat olacak başka bir şey? Temel olarak yalnızca AppCompat kullanmam gerekiyor mu?
Jameson

AppCompat'ınız, tasarımı belirten bir düzen kaynağını şişirir (bir grup satır içeren tablo). Ancak, bir satırı tıkladığınızda yeni bir sayfa açmak istediğinizi varsayalım. Yeni bir AppCompat Etkinliği veya Parçası açmak için bir onClickListener ayarlayabilirsiniz.
adao7000

3 Ağustos itibariyle, BigNerdRanch kitabının yeni bir baskısına sahiptir: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410 10:15

1
@ adao7000 dostum nerede 15 veya üstü için AppCompatActivity kullanabilirsiniz bahsetti - android.support.v7.app v7 gerekli minimum sdk için 7 olduğunu düşündüm.
kod tabanlı

1
@codebased android.support.v7, API 9 düzeyinde başlatılabilir. Kaynak: developer.android.com/topic/libraries/support-library/…
adao7000

30

Activitysınıf temel sınıftır. (Orijinal) Parça yönetimini destekler (API 11'den beri). Uzmanlık alanları çok daha iyi olduğu için artık saf kullanımı önerilmez.

ActionBarActivitybir anda oldu bir uygulamada İşlem Çubuğu işlemek için kolay çünkü Etkinlik sınıfına yedek.

AppCompatActivityolduğu İşlem Çubuğu artık teşvik edilmez çünkü gitmek yeni yolu ve (şu anda var yerine Toolbar kullanmalıdır İşlem Çubuğu yedek). AppCompatActivity, FragmentActivity'den miras alır, böylece Fragment'ları işlemeniz gerekirse (Fragment Manager aracılığıyla). AppCompatActivity HERHANGİ BİR API içindir, sadece 16+ için değil (bunu kim söyledi?). Gradle dosyanıza ekleyerek kullanabilirsiniz . API 10'da kullanıyorum ve mükemmel çalışıyor.compile 'com.android.support:appcompat-v7:24:2.0'


1
"ActionBar artık kullanımdan kaldırıldı" - eylem çubuğu kullanımdan kaldırıldı. "Bunun yerine Araç Çubuğu'nu kullanmanız gerekir" - uygulamaların kullanılması gerekmez Toolbar.
CommonsWare

@CommonsWare Tamam, kullanımdan kaldırıldı, ancak kullanımı daha saf haliyle (eskisi) artık teşvik edilmiyor. Şimdi, uygulamanızda bir Eylem Çubuğu olmasını istiyorsanız, bir Araç Çubuğu kullanarak manuel olarak eklemeniz gerekir.
Joaquin Iurchuk

"kullanımı artık daha saf haliyle teşvik edilmez" - Belgelemede veya resmi blog yazılarında iddianızı haklı çıkaracak hiçbir şey görmedim. Bağlantın var mı
CommonsWare

@CommonsWare Burada biriceksin ve haklısın. Yalnızca Malzeme tasarım yönergeleri, Araç Çubuğunun İşlem Çubuğu olarak kullanılmasını önerir. Belki kesin olmadığı için cevabımı silmeliyim. Teşekkürler
Joaquin Iurchuk

2
Destek Kitaplığı sürüm 26.0.0'dan (Temmuz 2017'de piyasaya sürüldü) başlayarak, desteklenen tüm minimum API düzeyi, tüm destek kitaplığı paketleri için Android 4.0 (API düzey 14) olarak değiştirildi. Kaynak: developer.android.com/topic/libraries/support-library/…
Andrea Leganza

12

Özellikle eski kaynakları okursanız, burada çok fazla karışıklık var.

Temel Activityolan, Parçaları gösterebilen. Android sürümü> 4'te iseniz bu kombinasyonu kullanabilirsiniz.

Ancak, orada bahsedilen diğer sınıfları kapsayan bir destek kütüphane de geçerli: FragmentActivity, ActionBarActivityve AppCompat. Başlangıçta, Android <4 sürümlerindeki parçaları desteklemek için kullanıldılar, ancak aslında Android'in daha yeni sürümlerinden (örneğin malzeme tasarımı) işlevselliği desteklemek için de kullanılıyorlar.

Sonuncusu AppCompat, diğeri daha yaşlı. Kullandığım strateji her zaman kullanmaktır AppCompat, böylece uygulama Android'in gelecekteki sürümlerinden backport durumunda hazır olacaktır.


Teşekkür ederim! Tamam, ev sahipliği yapmak için AppCompat'ı Etkinlik yerine kullanabilirim ... ne? Diğer AppCompats'lara ev sahipliği yapmak için mi? Veya FragmentActivities'i barındırmak için mi?
Jameson

Bir aktivite normalde sadece diğer parçaları barındırır ... Ve FragmentActivity hakkında endişelenmeyin, bu daha çok diğer tüm süslü XXXActivity'nin türetildiği bir "temel" sınıftır.
Mehdi

Ancak AppCompat'ım hangi sınıfı barındırmalı? Başka bir AppCompat mı yoksa başka bir şey mi?
Jameson

Burada anlamanız gereken tek bir şey var: etkinlikler fragmanlara ev sahipliği yapıyor. Bu arada etkinlikler başka hiçbir şey tarafından barındırılmaz, iç içe olamazlar. Appcompat başka bir tür faaliyettir. Bundan sonra parçaları yerleştirebilirsiniz, ancak bu yönetilmesi karmaşık olmaya başlar.
flower_green

1
Hayır, appcompat öğesini bir etkinlik olarak kullanırsınız ve parçalanmalara değil parçalara ev sahipliği yaparsınız.
flower_green

7

Eğer konuşursak Activity, AppcompactActivity, ActionBarActivityvs vs ..

Genişledikleri Temel sınıflar hakkında konuşmalıyız, Önce süper sınıfların hiyerarşisini anlamalıyız.

Her şey, tüm bu sınıflar için süper sınıf olan Bağlam'dan başlar.

Bağlam , uygulaması Android sistemi tarafından sağlanan soyut bir sınıftır. Uygulamaya özgü kaynaklara ve sınıflara erişimin yanı sıra, başlatma etkinlikleri, yayınlama ve alma amaçları gibi uygulama düzeyinde işlemler için çağrılara izin verir.

Context takip eder veya genişletir ContextWrapper

ContextWrapper uzatmak bir sınıftır Bağlam o sınıfı basitçe bütün başka Bağlamında yapılan çağrılarında delegeleri. Orijinal Bağlamı değiştirmeden davranışı değiştirmek için alt sınıflara ayrılabilir.

Şimdi Ulaşıyoruz Activity

Etkinlik genişleten bir sınıftır ContextThemeWrapper kullanıcı yapabileceği tek, odaklanmış bir şey olduğunu. Hemen hemen tüm etkinlikler kullanıcıyla etkileşime girer, bu nedenle Activity sınıfı sizin için bir pencere oluşturmaya özen gösterir

Aşağıdaki Sınıflar uzanmakla sınırlıdır, ancak kendi inişleri tarafından genişletilir ve belirli Api'ler için destek sağlar

SupportActivity birlikte uyumluluk işlevini düzenlenmesi için bir temel sınıftır Aktivite uzanan bir sınıftır

BaseFragmentActivityApi14 uzanan bir sınıftır SupportActivity Bu sınıf kısıtlı olduğu bir temel sınıf ama uzanması olan BaseFragmentActivityApi16 işlevselliğini desteklemek için V14

BaseFragmentActivityApi16 uzanan bir sınıftır BaseFragmentActivityApi14 {@code için bir temel sınıftır FragmentActivity } kullanmak mümkün v16 API'leri. Ama aynı zamanda sınıf kısıtlıdır ancak V16 işlevselliğini desteklemek için FragmentActivity tarafından genişletilir.

şimdi FragmentActivty

FragmentActivity genişleten bir sınıftır BaseFragmentActivityApi16 ve bu destek tabanlı Fragment ve Yükleyici API'leri kullanmak istiyor.

Bu sınıfı yeni platformun yerleşik parçası ve yükleyici desteğinin aksine kullanırken, bu özelliklere erişmek için sırasıyla getSupportFragmentManager()ve getSupportLoaderManager()yöntemlerini kullanmanız gerekir .

ActionBarActivity , Destek Kitaplığı'nın bir parçasıdır. Destek kütüphaneleri, eski platformlarda daha yeni özellikler sunmak için kullanılır. Örneğin, ActionBar API 11'de tanıtıldı ve varsayılan olarak Etkinliğin bir parçasıdır (aslında temaya bağlı olarak). Bunun aksine , eski platformlarda ActionBar yoktur . Bu nedenle destek kitaplığı , ActionBar'ın işlevselliğini ve kullanıcı arabirimini sağlayan bir alt sınıf ( ActionBarActivity ) sınıfı ekler

2015 yılında ActionBarActivity Destek Kütüphanesi revizyonu 22.1.0 önerilmiyor. Bunun yerine AppCompatActivity kullanılmalıdır.

AppcompactActivity genişleten bir sınıftır FragmentActivity destek kitaplığı işlem çubuğu özelliklerini kullanmak faaliyetler için Baz sınıftır.

Bu sınıfı etkinliğiniz için genişleterek ve etkinlik temasını veya benzer bir temayı ayarlayarak API düzey 7 veya daha yüksek bir sürümde çalışırken etkinliğinize bir ActionBar ekleyebilirsiniz.Theme.AppCompat

Buraya

Bu ikisine atıfta bulunuyorum bir , iki


3

Android'in gelecekteki sürümlerinde adın değişmesi muhtemel olduğundan (şu anda en son olanı AppCompatActivitymuhtemelen bir noktada değişecektir), iyi bir şeyin sahip olacağı bir sınıf olduğuna inanıyorum ve daha sonra tüm aktiviteleriniz Activitybu sınıftan uzanıyor AppCompatActivity. Yarın adı değiştirirlerse, AppCompatActivity2örneğin sadece bir yerde değiştirmeniz gerekir.


0

AppCompatActivity uzanır FragmentActivity uzanır BaseFragmentActivityApi16 uzanır BaseFragmentActivityApi14 uzanır SupportActivity uzanır Aktivite

Dolayısıyla Etkinlik herkesten daha hızlıdır ve AppCompatActivity en iyisidir.

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.