java - 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)
我怎么解决这个问题。我搜索了类似的问题,但解决方案没有帮助
解决方案
在 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);
}
解决方案我在这里得到它:感谢所有评论你的人提供了很多帮助
块引用
推荐阅读
- python - 如何在 opencv 的 bitwise_operation 中应用掩码?
- amazon-web-services - 在 AWS 或 Google 云上运行 Bluestacks
- android - 如何在颤动中根据屏幕更改文本大小和小部件大小?
- ios - 使用 Bindable 对象修改 SwiftUI 文本时收缩
- python - 在 for 循环中创建菜单使用 Python 中的最后一个索引值
- mysql - 如何循环通过 MySQL JSON 字段
- reactjs - 为什么反应应用程序中的代码覆盖率是空的?尝试使用 npm run test -- --coverage。但总是显示空代码覆盖率
- python - 如何更改条形图的颜色?
- matlab - 无法附加到 MATLAB 中的空容器映射
- sqlite - 对于少数用户,Sqlite DB 返回错误代码 9(中断)