为什么我尝试调用方法setVisibility()的值为null?

时间:2018-07-04 12:02:42

标签: java android

我有来自Firebase Craslytics的堆栈跟踪:

  

致命异常:java.lang.NullPointerException尝试调用   虚方法'void android.widget.ImageView.setVisibility(int)'在   空对象引用   com.accenture.vrmobile.BaseActivity.setDrawerVisibility(BaseActivity.java:497)

此方法报告崩溃:

    public void setDrawerVisibility(Boolean visible) {
    if (mButtonActionBarLeft == null)
        mButtonActionBarLeft = (ImageView) findViewById(R.id.button_actionbar_left);
    if (mButtonActionBarRight == null)
        mButtonActionBarRight = (ImageView) findViewById(R.id.button_actionbar_right);
    if (visible) {
        mButtonActionBarLeft.setVisibility(View.VISIBLE); //crashes at this line
        mButtonActionBarRight.setVisibility(View.VISIBLE);
    } else {
        mButtonActionBarLeft.setVisibility(View.INVISIBLE);
        mButtonActionBarRight.setVisibility(View.INVISIBLE);
    }
}

我之前曾发生过崩溃,因此我将以下行添加到方法中:

if (mButtonActionBarLeft == null)
        mButtonActionBarLeft = (ImageView) findViewById(R.id.button_actionbar_left);
    if (mButtonActionBarRight == null)
        mButtonActionBarRight = (ImageView) findViewById(R.id.button_actionbar_right);

但是它仍然崩溃并报告nullPointerException。 mButtonActionBarLeft和mButtonActionBarRight是用于打开/关闭导航抽屉的按钮。 我不知道为什么会这样。也许有人对此有经验? 谢谢!

P.S。我从来没有能够重现这种崩溃,这种情况很少发生。我只有来自Firebase的堆栈跟踪。

3 个答案:

答案 0 :(得分:0)

在活动ImageView回调中创建onCreate()的实例

还要确保您正在创建具有给定ID的布局文件中存在的实例。

public void onCreate(Bundle savedInstanceState)
{
        if (mButtonActionBarLeft == null)
            mButtonActionBarLeft = (ImageView) findViewById(R.id.button_actionbar_left);
        if (mButtonActionBarRight == null)
            mButtonActionBarRight = (ImageView) findViewById(R.id.button_actionbar_right);
}

了解有关NullPointerException的更多信息:-What is a NullPointerException, and how do I fix it?

答案 1 :(得分:0)

您必须添加View作为功能的输入。例如,

public void setVisible(View view){
    view.setVisibility(View.VISIBLE);
}
setVisible(toolbarText);

答案 2 :(得分:0)

尝试一下

    if (visible) {
        if(mButtonActionBarLeft.getVisibility()==View.INVISIBLE)
            mButtonActionBarLeft.setVisibility(View.VISIBLE);
        if(mButtonActionBarRight.getVisibility()==View.INVISIBLE)
            mButtonActionBarRight.setVisibility(View.VISIBLE);
    } else {
        if(mButtonActionBarLeft.getVisibility()==View.VISIBLE)
            mButtonActionBarLeft.setVisibility(View.INVISIBLE); 
        if(mButtonActionBarRight.getVisibility()==View.VISIBLE)
            mButtonActionBarRight.setVisibility(View.INVISIBLE);
    }