首页 > 解决方案 > java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 FloatingActionButton.setImageResource(int)'

问题描述

当应用程序检测到来电时,我正在尝试更改浮动操作按钮的图像。这是java类

public class PhoneCallReceiver extends BroadcastReceiver {

Main2Activity main2Activity;

@Override
public void onReceive(Context context, Intent intent) {

    String state= intent.getStringExtra(TelephonyManager.EXTRA_STATE);


    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {

        main2Activity=new Main2Activity();
        main2Activity.pauseWorkout();


    }

}

}

在 pauseWorkout 方法中,它包含对另一个更改浮动操作按钮图像的方法的方法调用,它是异常指向的位置。这是方法:

public void showPlayButton() {

    //CHANGING FLOATING ACTION BUTTON

    startPauseFAB.setImageResource(R.drawable.play_white);
    startPauseFAB.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.floating_action_button_color_play)));
    startPauseFAB.setRippleColor(getResources().getColor(R.color.myGreen));


}

startPauseFAB.setImageResource(R.drawable.play_white); 是问题所在。在 main2Activity 中,图像从播放变为暂停图标没有问题,但是当呼叫响起时,应用程序崩溃了。以下是它在 onCreate 上的初始化方式:

        startPauseFAB = (FloatingActionButton) findViewById(R.id.startAndPauseFAB);

这是浮动操作按钮的 xml:

 <android.support.design.widget.FloatingActionButton
                    android:id="@+id/startAndPauseFAB"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:layout_margin="16dp"
                    android:src="@drawable/play_white"
                    app:backgroundTint="@color/floating_action_button_color_play"
                    app:borderWidth="0dp"
                    app:elevation="8dp"
                    app:fabSize="normal" />

我尝试在startPauseFAB.setImageResource(R.drawable.play_white); 处使用调试工具;它说没有价值。

这是错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.leonk.workouttimerv1, PID: 13567
              java.lang.RuntimeException: Unable to start receiver com.example.leonk.workouttimerv1.classes.PhoneCallReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setImageResource(int)' on a null object reference
                  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2630)
                  at android.app.ActivityThread.access$1700(ActivityThread.java:151)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1387)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5268)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.FloatingActionButton.setImageResource(int)' on a null object reference
                  at com.example.leonk.workouttimerv1.Main2Activity.setFABButton(Main2Activity.java:1308)
                  at com.example.leonk.workouttimerv1.classes.PhoneCallReceiver.onReceive(PhoneCallReceiver.java:27)
                  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2623)
                  at android.app.ActivityThread.access$1700(ActivityThread.java:151) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1387) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5268) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697) 

我怎么解决这个问题。我搜索了类似的问题,但解决方案没有帮助

标签: javaandroid

解决方案


在 onReceive 方法的 phoneCallReceiver java 类中,我添加了方法调用 context.sendBroadCast,其意图如下

public class PhoneCallReceiver extends BroadcastReceiver {





@Override
public void onReceive(Context context, Intent intent) {

    String state= intent.getStringExtra(TelephonyManager.EXTRA_STATE);


    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {



    context.sendBroadcast(new Intent("PHONE_RING"));

    }

}

}

然后在 mainActivity 上创建 phoneCallReceiver 类的对象并覆盖 onReceive 方法,然后调用 Activity 方法来更改图像,如下所示:

 PhoneCallReceiver phoneCallReceiver=new PhoneCallReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {

        pauseWorkout();

    }
};

然后在 onCreate 上注册接收器,如下所示:

        registerReceiver(phoneCallReceiver,new IntentFilter("PHONE_RING"));

然后销毁:

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(phoneCallReceiver);

}

解决方案我在这里得到它:感谢所有评论你的人提供了很多帮助

块引用


推荐阅读