Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix getActionBar method may produce java.lang.NullPointerException

I am using a toolbar as my actionbar in an activity. I am trying to add the method getActionBar().setDisplayHomeAsUpEnabled(true); to the Activity.java file for Up navigation for older devices.

The method produces the following error message in Android Studio:

Method invocation may produce java.lang.NullPointerException

The Up navigation on the toolbar works fine on newer devices...now I'm trying to figure out how to make sure it will work for older devices. Please advise.

From build.gradle:

dependencies {    compile "com.android.support:appcompat-v7:22.1.0" } 

From AndroidManifest.xml:

android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen"  

From 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> 

from 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();             }         });     }  } 
like image 691
AJW Avatar asked Apr 22 '15 01:04

AJW


2 Answers

Actually Android Studio isn't showing you an "error message", it's just a warning.

Some answers propose the use of an assertion, Dalvik runtime has assertion turned off by default, so you have to actually turn it on for it to actually do something. In this case (assertion is turned off), what you're essentially doing is just tricking Android Studio to not show you the warning. Also, I prefer not to use "assert" in production code.

In my opinion, what you should do is very simple.

if(getActionBar() != null){    getActionBar().setDisplayHomeAsUpEnabled(true); } 

Update: In case you're using the support library version of the Action Bar, you should replace getActionBar() with getSupportActionBar().

if(getSupportActionBar() != null){     getSupportActionBar().setDisplayHomeAsUpEnabled(true); } 
like image 153
Adam G Avatar answered Sep 24 '22 09:09

Adam G


First off, you need to set the toolbar as the support ActionBar. Then if you're certain it's going to be there all the time, just assert it as != null. This will tell the compiler it won't be null, so the null check passes.

@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() } 
like image 31
Bogdan Zurac Avatar answered Sep 24 '22 09:09

Bogdan Zurac