android - getsupportactionbar - extends appcompatactivity error
Activity, AppCompatActivity, FragmentActivity y ActionBarActivity: ¿Cuándo usar cuál? (9)
Pensé que la actividad estaba en desuso
No.
Entonces, para el nivel 22 de API (con un soporte mínimo para el nivel 15 o 16 de API), ¿qué debo usar exactamente para alojar los componentes y para los componentes mismos? ¿Hay usos para todos estos, o debería usar uno o dos casi exclusivamente?
Activity
es la línea de base.
Cada actividad hereda de la
Activity
, directa o indirectamente.
FragmentActivity
se usa con el backport de fragmentos que se encuentran en las bibliotecas
support-v4
y
support-v13
.
La implementación nativa de fragmentos se agregó en el nivel 11 de API, que es inferior a los valores
minSdkVersion
propuestos.
La única razón por la que necesitaría considerar
FragmentActivity
específicamente es si desea usar fragmentos anidados (un fragmento que contiene otro fragmento), ya que eso no era compatible con fragmentos nativos hasta el Nivel 17 de API.
AppCompatActivity
es de la biblioteca
appcompat-v7
.
Principalmente, esto ofrece un backport de la barra de acción.
Dado que la barra de acción nativa se agregó en el Nivel de API 11, no necesita
AppCompatActivity
para eso.
Sin embargo, las versiones actuales de
appcompat-v7
también agregan un backport limitado de la estética de Material Design, en términos de la barra de acción y varios widgets.
Hay ventajas y desventajas de usar
appcompat-v7
, mucho más allá del alcance de esta respuesta específica de Stack Overflow.
ActionBarActivity
es el antiguo nombre de la actividad base de
appcompat-v7
.
Por varias razones, querían cambiar el nombre.
A menos que alguna biblioteca de terceros que esté utilizando insista en una
ActionBarActivity
, debería preferir
AppCompatActivity
sobre
ActionBarActivity
.
Entonces, dada su
minSdkVersion
en el rango de 15-16:
-
Si desea el aspecto de diseño de material con
AppCompatActivity
, useAppCompatActivity
-
Si no, pero desea fragmentos anidados, use
FragmentActivity
-
Si no, use
Activity
Simplemente agregando desde el comentario como nota:
AppCompatActivity
extiende
FragmentActivity
, por lo que cualquiera que necesite usar las funciones de
FragmentActivity
puede usar
AppCompatActivity
.
Vengo de iOS, donde es fácil y simplemente usas un UIViewController.
Sin embargo, en Android las cosas parecen mucho más complicadas, con ciertos componentes de UIC para niveles de API específicos.
Estoy leyendo BigNerdRanch para Android (el libro tiene aproximadamente 2 años) y sugieren que use
Activity
para alojar mis
FragmentActivities
.
Sin embargo, pensé que la
Activity
estaba en desuso.
Entonces, para el nivel 22 de API (con un soporte mínimo para el nivel 15 o 16 de API), ¿qué debo usar exactamente para alojar los componentes y para los componentes mismos? ¿Hay usos para todos estos, o debería usar uno o dos casi exclusivamente?
2019: use
AppCompatActivity
En el momento de escribir esto (verifique el enlace para confirmar que todavía es cierto), la
Documentación de Android
recomienda usar
AppCompatActivity
si está usando una barra de aplicaciones.
Este es el racional dado:
A partir de Android 3.0 (API nivel 11), todas las actividades que usan el tema predeterminado tienen una barra de acciones como barra de aplicaciones. Sin embargo, las funciones de la barra de aplicaciones se han agregado gradualmente a la barra de acción nativa en varios lanzamientos de Android. Como resultado, la barra de acción nativa se comporta de manera diferente dependiendo de qué versión del sistema Android pueda estar usando un dispositivo. Por el contrario, las funciones más recientes se agregan a la versión de la barra de herramientas de la biblioteca de soporte, y están disponibles en cualquier dispositivo que pueda usar la biblioteca de soporte.
Por este motivo, debe utilizar la clase de barra de herramientas de la biblioteca de soporte para implementar las barras de aplicaciones de sus actividades. El uso de la barra de herramientas de la biblioteca de soporte ayuda a garantizar que su aplicación tenga un comportamiento constante en la más amplia gama de dispositivos. Por ejemplo, el widget Toolbar proporciona una experiencia de diseño de material en dispositivos que ejecutan Android 2.1 (API nivel 7) o posterior, pero la barra de acción nativa no admite diseño de material a menos que el dispositivo ejecute Android 5.0 (API nivel 21) o posterior.
Las instrucciones generales para agregar una barra de herramientas son
- Agregue la biblioteca de soporte v7 appcompat
-
Haga que todas sus actividades extiendan
AppCompatActivity
-
En el manifiesto declara que quieres
NoActionBar
. -
Agregue una
ToolBar
deToolBar
al diseño xml de cada actividad. -
Obtenga la
onCreate
ToolBar
enonCreate
cada actividad.
Consulte las instrucciones de la documentación para más detalles. Son bastante claros y útiles.
Aquí hay mucha confusión, especialmente si lees fuentes obsoletas.
El básico es
Activity
, que puede mostrar Fragmentos.
Puede usar esta combinación si está en la versión de Android> 4.
Sin embargo, también hay una biblioteca de soporte que abarca las otras clases que mencionó:
FragmentActivity
,
ActionBarActivity
y
AppCompat
.
Originalmente se usaban para admitir fragmentos en versiones de Android <4, pero en realidad también se usan para respaldar la funcionalidad de versiones más recientes de Android (diseño de materiales, por ejemplo).
El último es
AppCompat
, los otros 2 son más antiguos.
La estrategia que uso es usar siempre
AppCompat
, para que la aplicación esté lista en caso de backports de futuras versiones de Android.
Dado que es probable que el nombre cambie en futuras versiones de Android (actualmente, la última es
AppCompatActivity
pero probablemente cambiará en algún momento), creo que es bueno tener una
Activity
clase que amplíe
AppCompatActivity
y luego todas sus actividades se extiendan a partir de eso uno.
Si mañana cambian el nombre a
AppCompatActivity2
por ejemplo, tendrá que cambiarlo en un solo lugar.
Para un nivel mínimo de API de 15, querrás usar
AppCompatActivity
.
Entonces, por ejemplo, su
MainActivity
se vería así:
public class MainActivity extends AppCompatActivity {
....
....
}
Para usar
AppCompatActivity
, asegúrese de tener descargada la Biblioteca de soporte de Google (puede verificar esto en Herramientas -> Android -> Administrador de SDK).
Luego solo incluya la dependencia de gradle en el archivo gradle.build de su aplicación:
compile ''com.android.support:appcompat-v7:22:2.0''
Puede usar este
AppCompat
como su
Activity
principal, que luego se puede usar para iniciar Fragmentos u otras Actividades (esto depende del tipo de aplicación que esté creando).
El libro BigNerdRanch es un buen recurso, pero sí, está desactualizado. Léalo para obtener información general sobre cómo funciona Android, pero no espere que las clases específicas que usan estén actualizadas.
Si habla de
Activity
,
AppcompactActivity
,
ActionBarActivity
, etc.
Necesitamos hablar sobre las clases Base que están extendiendo. Primero tenemos que entender la jerarquía de las superclases.
Todas las cosas se inician desde Context, que es una superclase para todas estas clases.
El contexto es una clase abstracta cuya implementación es proporcionada por el sistema Android. Permite el acceso a recursos y clases específicos de la aplicación, así como llamadas ascendentes para operaciones a nivel de la aplicación, como actividades de lanzamiento, difusión y recepción de intenciones, etc.
Context
es seguido o extendido por
ContextWrapper
ContextWrapper es una clase que extiende la clase Context que simplemente delega todas sus llamadas a otro Context. Se puede subclasificar para modificar el comportamiento sin cambiar el contexto original.
Ahora llegamos a la
Activity
La actividad es una clase que extiende ContextThemeWrapper que es una cosa única y enfocada que el usuario puede hacer. Casi todas las actividades interactúan con el usuario, por lo que la clase Actividad se encarga de crear una ventana para usted.
Las clases a continuación están restringidas para extenderse, pero su descendente las extiende internamente y brindan soporte para Api específicas
SupportActivity es una clase que extiende la actividad que es una clase base para componer juntas la funcionalidad de compatibilidad
BaseFragmentActivityApi14 es una clase que extiende SupportActivity que es una clase Base. Es una clase restringida pero BaseFragmentActivityApi16 lo extiende para admitir la funcionalidad de V14.
BaseFragmentActivityApi16 es una clase que extiende BaseFragmentActivityApi14 que es una clase Base para que {@code FragmentActivity } pueda usar las API v16 . Pero también es una clase restringida, pero FragmentActivity la extiende para admitir la funcionalidad de V16.
ahora FragmentActivty
FragmentActivity es una clase que extiende BaseFragmentActivityApi16 y que quiere usar las API de Fragment and Loader basadas en soporte.
Al usar esta clase en lugar de la compatibilidad con el cargador y los fragmentos integrados de la nueva plataforma, debe usar los
getSupportFragmentManager()
y
getSupportLoaderManager()
respectivamente para acceder a esas funciones.
ActionBarActivity es parte de la Biblioteca de soporte. Las bibliotecas de soporte se utilizan para ofrecer nuevas funciones en plataformas más antiguas. Por ejemplo, ActionBar se introdujo en API 11 y es parte de la Actividad de forma predeterminada (dependiendo del tema en realidad). Por el contrario, no hay ActionBar en las plataformas más antiguas. Entonces, la biblioteca de soporte agrega una clase secundaria de Actividad ( ActionBarActivity ) que proporciona la funcionalidad y la interfaz de usuario de ActionBar
En 2015, ActionBarActivity está en desuso en la revisión 22.1.0 de la Biblioteca de soporte. AppCompatActivity debería usarse en su lugar.
AppcompactActivity es una clase que extiende FragmentActivity que es la clase Base para actividades que utilizan las funciones de la barra de acción de la biblioteca de soporte.
Puede agregar una
Barra
de
acciones
a su actividad cuando se ejecuta en el nivel de API 7 o superior extendiendo esta clase para su actividad y configurando el tema de la actividad en
Theme.AppCompat
o un tema similar
Activity
clase de
Activity
es la clase básica.
(El original) Es compatible con la gestión de fragmentos (desde API 11).
Ya no se recomienda su uso puro porque sus especializaciones son mucho mejores.
ActionBarActivity
fue en un momento
el
reemplazo de la clase Activity porque facilitó el manejo de ActionBar en una aplicación.
AppCompatActivity
es
el
nuevo camino a seguir porque ya no se recomienda ActionBar y en su lugar debería usar Toolbar (que actualmente es
el
reemplazo de ActionBar).
AppCompatActivity hereda de FragmentActivity, por lo que si necesita manejar Fragmentos, puede hacerlo (a través del Administrador de Fragmentos).
AppCompatActivity es para CUALQUIER API, no solo para mayores de 16 años (¿quién dijo eso?).
Puede usarlo agregando la
compile ''com.android.support:appcompat-v7:24:2.0''
en su archivo Gradle.
Lo uso en API 10 y funciona perfecto.
Activity
es la clase base de todas las demás actividades, no creo que sea obsoleta.
La relación entre ellos es:
Activity
<-
FragmentActivity
<-
AppCompatActivity
<-
ActionBarActivity
''<-'' significa herencia aquí.
La
reference
dice que
ActionBarActivity
está en desuso, use
AppCompatActivity
en
AppCompatActivity
lugar.
Básicamente, usar
AppCompatActivity
es siempre la elección correcta.
Las diferencias entre ellos son:
-
Activity
es la básica. -
Basado en la
Activity
,FragmentActivity
proporciona la capacidad de usarFragment
. -
Basado en
FragmentActivity
,AppCompatActivity
proporciona características aActionBar
.
AppCompatActivity extiende FragmentActivity extiende BaseFragmentActivityApi16 extiende BaseFragmentActivityApi14 extiende SupportActivity extiende Actividad
Entonces, Activity es más rápido que todos y AppCompatActivity es lo mejor de todo.