【发布时间】:2019-01-21 16:01:40
【问题描述】:
当应用检测到来电时,我正在尝试更改浮动操作按钮的图像。这是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)
我该如何解决这个问题。我搜索了类似的问题,但解决方案没有帮助
【问题讨论】:
-
你在哪个地方初始化它?初始化后检查“startPauseFAB”是否不为空。
-
"main2Activity=new Main2Activity();"不要那样做。这个 main2Activity 永远不会显示,所以它的 onCreate() 不会被调用,所以 setContentView() 不会运行,所以引用 View 的变量不会有不同于 null 的值
-
您必须使用 Context.startActivity() 从广播中启动 Activity
-
我认为,由于您像常规类一样实例化 main2activity,如果您在广播接收器中使用 context.startActivity 并传递字符串或其他内容,则永远不会调用 oncreate,然后您在活动中调用 pauseWorkout
-
@JRowan 和 0X0nosugar 你们都提出了有效的观点,context.startActivity 将再次启动活动,我只是希望它保持在同一个活动上,因为正在发生一个过程,以便它只是改变图像。有没有办法重新初始化它?