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); 
  • Configurar la barra de herramientas como barra de acción en fragmento
  • OnCreateOptionsMenu no recibe llamadas en Android 7.0
  • Android cómo utilizar la barra de herramientas en ListActivity?
  • Creación de un SearchView que se parezca a las directrices de diseño del material
  • Elemento de menú de la barra de herramientas que no se puede hacer clic en android 4.4 (19)
  • ¿Qué utilizar en lugar de getSupportActionBar () en la Biblioteca 22?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.