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:

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(); } }); } } 

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); 
  • Título, etc. que no se muestran en la barra de herramientas de Android
  • 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?
  • No solicite Window.FEATURE_ACTION_BAR y defina windowActionBar como false en su tema para usar una barra de herramientas en su lugar
  • ¿Cómo eliminar la sombra sobre la barra de aplicaciones?
  • Usar la barra de herramientas en todas las actividades (Android)
  • Configurar la barra de herramientas como barra de acción en fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.