Cómo arreglar el método getActionBar puede producir java.lang.NullPointerException
Estoy usando una barra de herramientas como mi barra de acción en una actividad. Estoy intentando agregar el método getActionBar().setDisplayHomeAsUpEnabled(true);
Al archivo Activity.java para la navegación hacia arriba de dispositivos antiguos.
El método produce el siguiente mensaje de error en Android Studio:
- Título, etc. que no se muestran en la barra de herramientas de Android
- ¿Cómo eliminar la sombra sobre la barra de aplicaciones?
- Comportamiento incorrecto de los atributos de la gravedad de las vistas secundarias de la nueva barra de herramientas Android
- Icono de navegación de la barra de herramientas nunca configurado
- El botón de inicio de la barra de herramientas de Android no aparece
La invocación del método puede producir java.lang.NullPointerException
La navegación hacia arriba de la barra de herramientas funciona bien en los dispositivos más nuevos … ahora estoy tratando de averiguar cómo asegurarse de que funcionará para los dispositivos más antiguos. Por favor avise.
De build.gradle:
dependencies { compile "com.android.support:appcompat-v7:22.1.0" }
Desde AndroidManifest.xml:
android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen"
De styles.xml
<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme"> <item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="android:windowFullscreen">true</item>
De Activity.java
public class CardViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cardviewinput); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { // Up navigation to the parent activity for 4.0 and earlier getActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationIcon(R.drawable.ic_action_previous_item); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } }
- Cómo animar Burger to Arrow con Appcompat v7 21, Toolbar y DrawerLayout
- Android: cambia las direcciones completas de la distribución de la aplicación mediante programación
- El cajón de navegación en android no está en pantalla completa
- El botón Inicio de la barra de herramientas no funciona si no hay ningún menú de opciones
- Barra de herramientas Android mostrar / ocultar espacio en blanco
- Cómo cambiar el color de la barra de herramientas y los colores de la barra de estado de acuerdo con el color de la imagen en el diseño de material android?
- Usar la barra de herramientas en todas las actividades (Android)
- No solicite Window.FEATURE_ACTION_BAR y defina windowActionBar como false en su tema para usar una barra de herramientas en su lugar
En realidad Android Studio no le está mostrando un "mensaje de error", es sólo una advertencia.
Algunas respuestas proponen el uso de una aserción, Dalvik tiempo de ejecución tiene la aserción desactivada por defecto, por lo que tiene que en realidad activarla para que realmente haga algo. En este caso (la aserción está desactivada), lo que estás haciendo es engañar a Android Studio para no mostrarte la advertencia. Además, prefiero no usar "asert" en el código de producción.
En mi opinión, lo que debe hacer es muy simple.
if(getActionBar() != null){ getActionBar().setDisplayHomeAsUpEnabled(true); }
Actualización: en caso de que esté utilizando la versión de la biblioteca de soporte de la barra de acciones, debe reemplazar getActionBar () por getSupportActionBar ().
if(getSupportActionBar() != null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
Primero apagado, usted necesita fijar la barra de herramientas como el ActionBar de la ayuda. Entonces, si estás seguro de que va a estar allí todo el tiempo, sólo afirmarlo como! = Null. Esto le dirá al compilador que no será nulo, por lo que pasa el cheque nulo.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cardviewinput); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); assert getSupportActionBar() != null; getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar() }
Gracias Andrew por su respuesta. Si tiene un Nav Drawer o algo más que use getSupportActionBar () necesita agregar assert getSupportActionBar ()! = Null;
Paz,
Ejemplo:
@Override public void setTitle(CharSequence title) { mTitle = title; assert getSupportActionBar() != null; getSupportActionBar().setTitle(mTitle); }
Prueba esto :
private ActionBar getActionBar() { return ((AppCompatActivity) getActivity()).getSupportActionBar(); }
Lo que he hecho es anular el método getSupportActionBar()
en mi actividad base y agregar una anotación @NonNull
. De esta manera, solo obtengo una advertencia de pelusa en la actividad base acerca de cómo uso la anotación @NonNull
para algo que tiene una anotación @Nullable
.
@NonNull @Override public ActionBar getSupportActionBar() { // Small hack here so that Lint does not warn me in every single activity about null // action bar return super.getSupportActionBar(); }
Add assert getSupportActionBar() != null;
Antes de getSupportActionBar().setDisplayHomeAsUpEnabled(true);
He creado una clase genérica como:
public final class Cast { private Cast() {} /** * Helps to eliminate annoying NullPointerException lint warning. */ @android.support.annotation.NonNull public static <T> T neverNull(T value) { return value; } }
Entonces puedo utilizarlo para cualquier llamada con la advertencia NullPointerException para la que estoy seguro de que nunca sucederá, por ejemplo
final ActionBar actionBar = Cast.neverNull(getSupportActionBar()); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true);
PS no olvide añadir "com.android.support:support-annotations" a su archivo gradle.
if(actionBar != null) { actionBar.setHomeButtonEnabled(true); actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext, R.drawable.action_bar_gradient)); }
Utilice este tema: android:theme="@style/Theme.AppCompat.Light.NoActionBar"
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("Title"); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item); actionBar.setDisplayHomeAsUpEnabled(true);
- Cómo dibujar polígono mano libre en Google mapa V2 en Android?
- Cómo agregar una sombra y un borde en circular imageView android?