【问题标题】:java.lang.NullPointerException: Attempt to invoke virtual method FloatingActionButton.setImageResource(int)' on a null object referencejava.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 FloatingActionButton.setImageResource(int)'
【发布时间】: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 将再次启动活动,我只是希望它保持在同一个活动上,因为正在发生一个过程,以便它只是改变图像。有没有办法重新初始化它?

标签: java android


【解决方案1】:

在 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);

}

解决方案我知道了here :感谢所有评论你的人提供了很多帮助

块引用

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 2015-04-20
    • 2015-08-17
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多