Activity、AppCompatActivity、FragmentActivity、およびActionBarActivity:いつどちらを使用するか?


266

私はiOSから来ており、簡単で、UIViewControllerを使用するだけです。ただし、Androidでは、特定のAPIレベルに対応する特定のUIComponentがあるため、状況ははるかに複雑に見えます。私はBigNerdRanch for Android(この本は約2年前のものです)を読んでいます。Activity、をホストためするていFragmentActivitiesます。しかし、私Activityは非難されたと思いました。

それで、APIレベル22(APIレベル15または16の最小サポートあり)の場合、コンポーネントのホストとコンポーネント自体の両方に正確に何を使用する必要がありますか?これらすべての用途はありますか、それとも1つまたは2つをほぼ独占的に使用する必要がありますか?


1
FragmentActivityiesをホストすることはありません。ホストするのはのみですFragment。新しいAndroidバージョンでは、Activityクラス自体が更新され、直接ホストされます。古いバージョンをサポートするためFragmentActivityに導入されました。
Ravi Thapliyal 2015

5
同様に、API 11以降では、IES ActivityはをサポートしていましたActionBar。これは、古いバージョンでActionBarActivity最初からサポートされていましたが、現在は非推奨になり、に置き換えられていAppCompatActivityます。以降、これらのクラスは両方とも拡張されFragmentActivity、ホスティングFragmentもサポートします。
Ravi Thapliyal 2015

回答:


327

アクティビティは廃止予定だと思いました

番号。

それで、APIレベル22(APIレベル15または16の最小サポートあり)の場合、コンポーネントのホストとコンポーネント自体の両方に正確に何を使用する必要がありますか?これらすべての用途はありますか、それとも1つまたは2つをほぼ独占的に使用する必要がありますか?

Activityベースラインです。すべての活動はActivity、直接または間接的にます。

FragmentActivitysupport-v4およびsupport-v13ライブラリにあるフラグメントのバックポートで使用するためのものです。フラグメントのネイティブ実装は、提案されたminSdkVersion値よりも低いAPIレベル11で追加されました。考慮する必要がある唯一の理由FragmentActivityAPIレベル17まではネイティブフラグメントでサポートされていなかった具体的は、ネストされたフラグメント(別のフラグメントを保持するフラグメント)を使用する場合です。

AppCompatActivityappcompat-v7図書館からです。主に、これはアクションバーのバックポートを提供します。ネイティブアクションバーはAPIレベル11で追加されたAppCompatActivityため、その必要はありません。ただし、の現在のバージョンでappcompat-v7は、アクションバーとさまざまなウィジェットに関して、マテリアルデザインの美学の限定的なバックポートも追加されています。使用には長所と短所がありますappcompat-v7、この特定のスタックオーバーフローの回答の範囲をはるかに超えています。

ActionBarActivityは、のベースアクティビティの古い名前ですappcompat-v7。さまざまな理由で、名前を変更したいと考えました。使用している一部のサードパーティライブラリがを主張しない限りActionBarActivity、を優先する必要AppCompatActivityがありActionBarActivityます。

したがって、minSdkVersion15〜16の範囲の場合、

  • バックポートされたマテリアルデザインの外観が必要な場合は、 AppCompatActivity

  • そうでない場合でも、フラグメントをネストしたい場合は、 FragmentActivity

  • そうでない場合は、 Activity

注釈としてコメントから追加するだけです:AppCompatActivity拡張FragmentActivity。そのため、の機能を使用する必要がある人は誰でも使用FragmentActivityできますAppCompatActivity


マテリアルデザインの外観を使用し、フラグメントをネストしたい場合はどうすればよいですか?AppCompatActivityはFragmentActivityを継承しますか?
Orcun Sevsay 2015年

4
@MiloRambaldi:はい、FragmentActivityの祖先ですAppCompatActivity。ネストされたフラグメントを使用することはお勧めしませんが、ネストされたフラグメントがまったく機能する限り、ネストされたフラグメントAppCompatActivityをサポートします。
CommonsWare、2015年

詳細な回答@CommonsWareをありがとう。つまり、どのminSDK Activityで、最新のほとんどを使用せずに、support-v7つまりバックポートされていないマテリアルデザインを使用できるようになるでしょうか。私の目標は、19分25ターゲット25
jugutier

1
@jugutier:を使用Theme.MaterialするにminSdkVersionは、21以上が必要です。
CommonsWare 2017

83

Activity他のすべてのアクティビティの基本クラスですが、廃止されることはないと思います。それらの間の関係は次のとおりです。

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

ここで「<-」は継承を意味します。参照は、前記ActionBarActivity廃止され、使用AppCompatActivity代わり。

したがって、基本的に、使用することAppCompatActivityは常に正しい選択です。それらの違いは次のとおりです。

  • Activity 基本的なものです。
  • に基づいてActivityFragmentActivity使用する機能を提供しますFragment
  • に基づいてFragmentActivity、にAppCompatActivity機能を提供しますActionBar

2
エレガントな答え。
M.kazem Akhgary 2018年

69

2019:使用 AppCompatActivity

この記事の執筆時点では(リンクをチェックして、それが正しいことを確認してください)、アプリバーを使用しているAppCompatActivity場合は、Androidドキュメントでの使用を推奨しています。

これは与えられた合理的です:

Android 3.0(APIレベル11)以降、デフォルトのテーマを使用するすべてのアクティビティには、アプリバーとしてのActionBarがあります。ただし、アプリバーの機能は、さまざまなAndroidリリースでネイティブActionBarに徐々に追加されています。その結果、ネイティブActionBarの動作は、デバイスが使用しているAndroidシステムのバージョンによって異なります。対照的に、最新の機能はサポートライブラリのバージョンのツールバーに追加され、サポートライブラリを使用できるすべてのデバイスで利用できます。

このため、サポートライブラリのToolbarクラスを使用して、アクティビティのアプリバーを実装する必要があります。サポートライブラリのツールバーを使用すると、アプリが幅広いデバイスで一貫した動作をするようになります。たとえば、ツールバーウィジェットは、Android 2.1(APIレベル7)以降を実行しているデバイスでマテリアルデザインエクスペリエンスを提供しますが、デバイスがAndroid 5.0(APIレベル21)以降を実行していない限り、ネイティブアクションバーはマテリアルデザインをサポートしません。

ツールバーを追加するための一般的な指示は次のとおりです

  1. v7 appcompatサポートライブラリを追加する
  2. すべての活動を拡張する AppCompatActivity
  3. マニフェストで、必要なことを宣言しますNoActionBar
  4. ToolBar各アクティビティのxmlレイアウトにを追加します。
  5. ToolBar各アクティビティのを取得しonCreateます。

詳細については、ドキュメントの指示を参照してください。彼らは非常に明確で親切です。


こんにちは@Suragch、これに感謝します。今日は21以降のみをサポートするアプリを作成しているとしましょう。実際、たまたま私はアクションバーやアプリバー(フルスクリーンアプリではない)を望んでいません。Studioからの提案(11月16日)「下位互換性(AppCompat)」を使用する可能性があります。私の直感はAppCompatを使用しないことです。あなたの専門家の意見は何ですか?ありがとう、ありがとう。
Fattie 2016年

私は専門家ではないので、専門家の意見を述べることはできませんが、ドキュメントでは、できるだけ多くのデバイスをサポートすることを推奨しています。私はすべてのアプリでAppCompatを使用していますが、これまでのところうまくいきました。21より前のバージョンをサポートしたくない場合は、Studioの提案を無視してかまいません。
Suragch 2017年

50

最小APIレベルが15の場合、を使用しますAppCompatActivity。したがって、たとえば、次のようにMainActivityなります。

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

を使用するAppCompatActivityには、Googleサポートライブラリがダウンロードされていることを確認してください([ツール]-> [Android]-> [SDKマネージャー]で確認できます)。次に、アプリのgradle.buildファイルにgradle依存関係を含めるだけです。

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

これAppCompatをメインとしてActivity使用し、フラグメントまたはその他のアクティビティを起動するために使用できます(これは、作成するアプリの種類によって異なります)。

BigNerdRanchの本は良いリソースですが、そうです、時代遅れです。Androidの動作に関する一般的な情報については、こちらをお読みください。ただし、Androidが使用する特定のクラスが最新であるとは期待しないでください。


はい、gradle.buildファイルに依存関係があります。たとえば、(Notesアプリケーションのように)一連の行を含むテーブルを作成している場合、メイン画面はAppCompatになり、他にホストされるものもAppCompatになりますか?基本的にAppCompatだけを使用する必要がありますか?
Jameson

そのため、AppCompatはデザイン(行の束を持つテーブル)を指定するレイアウトリソースを膨らませます。しかし、行をクリックしたときに新しいページを開きたいとしましょう。onClickListenerを設定して、新しいAppCompatアクティビティまたはフラグメントを開くことができます。
adao7000 2015

:8月3日の時点で、BigNerdRanchは、その本の新しい版があるamazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/...
bryant1410

1
@ adao7000 mateは15以上でAppCompatActivityを使用できると述べました-android.support.v7.appのv7は必要な最小SDKは7であると思いました
コードベース

1
:@codebased android.support.v7は、APIレベル9ソースで開始に使用することができますdeveloper.android.com/topic/libraries/support-library/...
adao7000

30

Activityクラスは基本クラスです。(オリジナル)フラグメント管理をサポートします(API 11以降)。その専門化がはるかに優れているため、もはやその純粋な使用は推奨されません。

ActionBarActivity一瞬にあった、それはアプリでアクションバーを処理するために簡単に作られたため、Activityクラスに交換。

AppCompatActivityあるアクションバーはもう奨励されていない、あなたは(現在だその代わりに、ツールバーを使用する必要がありますので、行くための新しい方法は、アクションバーの交換)。AppCompatActivityはFragmentActivityを継承するため、フラグメントを処理する必要がある場合は(フラグメントマネージャーを介して)実行できます。AppCompatActivityは、16歳以上(だれが言ったのか)だけでなく、すべてのAPI用です。Gradleファイルに追加することで使用できます。私はそれをAPI 10で使用し、完璧に動作します。compile 'com.android.support:appcompat-v7:24:2.0'


1
「ActionBarは非推奨になりました」-アクションバーは非推奨ではありません。「代わりにツールバーを使用する必要があります」-アプリで使用する必要はありませんToolbar
CommonsWare、2015

@CommonsWare OK、非推奨ではありませんが、より純粋な形式(古い形式)での使用は推奨されません。さて、あなたはアプリでアクションバーを持つようにしたい場合は、あなたは、ツールバーを使用して手動で追加する必要があります。
Joaquin Iurchuk 2015

「より純粋な形での使用はもう奨励されていない」-あなたの主張を正当化するようなドキュメントや公式ブログの投稿には何も見たことがない。リンクはありますか?
CommonsWare、2015

@CommonsWareあなたはここでの卓越性であり、あなたは正しい。マテリアルデザインのガイドラインのみが、アクションバーとしてのツールバーの使用を提案しています。答えが正確ではないので、多分私は私の答えを削除すべきです。ありがとう
Joaquin Iurchuk

2
サポートライブラリバージョン26.0.0(2017年7月にリリース)以降、すべてのサポートライブラリパッケージで、サポートされる最小APIレベルがAndroid 4.0(APIレベル14)に変更されました。ソース:developer.android.com/topic/libraries/support-library/...
アンドレアLeganzaで

12

ここでは、特に古いソースを読んでいる場合、多くの混乱があります。

基本的なものはでActivity、フラグメントを表示できます。Androidバージョン> 4の場合は、この組み合わせを使用できます。

しかし、そこにあなたが言及した他のクラスを含むサポート・ライブラリもある:FragmentActivityActionBarActivityAppCompat。元々は、Androidバージョン4未満のフラグメントをサポートするために使用されていましたが、実際には、新しいバージョンのAndroid(マテリアルデザインなど)の機能をバックポートするためにも使用されています。

最新のものはAppCompat、他の2つは古いです。私が使用する戦略は、常にを使用することですAppCompat。これにより、将来のバージョンのAndroidからのバックポートが発生した場合に備えて、アプリを準備できます。


ありがとうございました!OK、ホストするためにActivityの代わりにAppCompatを使用できます...何ですか?他のAppCompatをホストするには?またはFragmentActivitiesをホストするために?
Jameson、2015

アクティビティは通常、他のフラグメントのみをホストします...そしてFragmentActivityについて心配する必要はありません。他のすべてのファンシーXXXActivityの派生元である「ベース」クラスのようなものです。
Mehdi

しかし、どのクラスをAppCompatでホストする必要がありますか?別のAppCompat、または何か他のもの?
Jameson

ここで理解しておくべきことは1つだけです。アクティビティはフラグメントをホストします。ところで、アクティビティは他のものによってホストされておらず、ネストすることはできません。Appcompatは、もう1つの種類のアクティビティです。その後、フラグメントをネストしてネストすることができますが、管理が複雑になります。
flower_green 2015

1
いいえ、appcompatをアクティビティとして使用し、フラグメントアクティビティではなくフラグメントをホストします。
flower_green

7

あなたはについて話す場合はActivityAppcompactActivityActionBarActivityなどなど。

拡張している基本クラスについて話す必要があります。まず、スーパークラスの階層を理解する必要があります。

すべてのものは、これらすべてのクラスのスーパークラスであるContextから開始されます。

Contextは、Androidシステムによって実装が提供される抽象クラスです。これは、アプリケーション固有のリソースとクラスへのアクセスを可能にするだけでなく、アクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールを可能にします。

Context 後に続く、または拡張される ContextWrapper

ContextWrapperが拡張クラスであるコンテキストというクラスを単純にすべての別のコンテキストへの呼び出しの代表者。元のコンテキストを変更せずに動作を変更するためにサブクラス化できます。

今、私たちはリーチします Activity

活動は、拡張するクラスですContextThemeWrapperをユーザーが行うことができ、単一、集中ものです。ほとんどすべてのアクティビティがユーザーと対話するため、Activityクラスがウィンドウを作成します

以下のクラスは拡張が制限されていますが、それらのディセンダーによって内部的に拡張され、特定のAPIをサポートします

SupportActivityは一緒に互換機能を構成するための基本クラスであるアクティビティを拡張するクラスであります

BaseFragmentActivityApi14は拡張するクラスですSupportActivityを それはクラス制限されている基本クラスですが、によって拡張され BaseFragmentActivityApi16の機能をサポートするためにV14を

BaseFragmentActivityApi16を拡張するクラスである BaseFragmentActivityApi14を {@codeの基本クラスである FragmentActivity }使用できるようにV16の APIを。しかし、これも制限付きクラスですが、V16の機能をサポートするためにFragmentActivityによって拡張されています。

今FragmentActivty

FragmentActivityは拡張するクラスです BaseFragmentActivityApi16をし、それがサポートベースのフラグメントおよびLoader APIを使用したいと考えています。

新しいプラットフォームの組み込みフラグメントおよびローダーサポートではなく、このクラスを使用する場合は、 getSupportFragmentManager()およびgetSupportLoaderManager()メソッドをそれぞれ、これらの機能にアクセスます。

ActionBarActivityはサポートライブラリの一部です。サポートライブラリは、古いプラットフォームで新しい機能を提供するために使用されます。たとえば、ActionBarはAPI 11で導入され、デフォルトでアクティビティの一部です(実際にはテーマによって異なります)。対照的に、ActionBarはありません。に、古いプラットフォーム。そのため、サポートライブラリは、ActionBarの機能とUI を提供するActivity(ActionBarActivity)の子クラスを追加します

2015年 ActionBarActivityはサポートライブラリのリビジョン22.1.0で非推奨になりました。代わりにAppCompatActivityを使用する必要があります。

AppcompactActivityは拡張するクラスです FragmentActivityサポートライブラリアクションバーの機能を使用して活動の基本クラスです。

このクラスをアクティビティ用に拡張し、アクティビティテーマを次のように設定することで、APIレベル7以上で実行するときに、アクティビティにActionBarを追加できます。Theme.AppCompatまたは同様のテーマ

ここに

私はこれら2つ1つ2つを参照します


3

名前は将来のバージョンのAndroidで変更される可能性があるため(現在は最新のものですAppCompatActivityが、いつか変更される可能性があります)、クラスActivityを拡張AppCompatActivityし、すべてのアクティビティをそのクラスから拡張することをお勧めします。明日にAppCompatActivity2なると、たとえば名前を1か所で変更する必要があります。


0

AppCompatActivity extends FragmentActivity extends BaseFragmentActivityApi16 extends BaseFragmentActivityApi14 extends SupportActivity extends Activity

したがって、Activityはすべてよりも速く、AppCompatActivityはすべての中で最高です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.