【问题标题】:NullPointerException at onClick methodonClick 方法出现 NullPointerException
【发布时间】:2020-12-29 05:37:48
【问题描述】:

我正在 Android Studio 上制作应用程序,但在我的 onClick 方法中遇到了 NullPointerException。我该如何解决?

我的应用程序的调试器给了我这个:

java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:6256) 
        at android.view.View$PerformClick.run(View.java:24701) 
        at android.os.Handler.handleCallback(Handler.java:789) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageDrawable(android.graphics.drawable.Drawable)' on a null object reference
        at com.example.venttome.ventingPage.onClick(ventingPage.java:66)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:6256) 
        at android.view.View$PerformClick.run(View.java:24701) 
        at android.os.Handler.handleCallback(Handler.java:789) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

错误的代码(onClick() 方法):

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.record_btn:
            if (isRecording){
               //stop recording
                recordButton.setImageDrawable(getResources().getDrawable(R.drawable.record_btn_stopped, null));
                isRecording = false;
            } else {
                //start recording
                recordButton.setImageDrawable(getResources().getDrawable(R.drawable.record_btn_recording, null));
                isRecording = true;
            }
            break;
    }
}

这是我的那个类的 XML 文件,它是一个约束布局。这是我用于 onClick 方法的内容,我不知道它有什么问题:

    <ImageView
        android:id="@+id/record_btn"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:layout_marginStart="40dp"
        android:layout_marginLeft="40dp"
        android:layout_marginBottom="28dp"
        android:background="@android:color/white"
        android:clickable="true"
        android:cropToPadding="true"
        android:onClick="onClick"
        android:src="@drawable/record_btn_stopped"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toLeftOf="@id/final_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputFeelings"
        app:layout_constraintVertical_bias="1.0"
        android:focusable="true"
        tools:ignore="ContentDescription" />

【问题讨论】:

  • 您是否在 onCreate( ) 之后的 OnClick 之前为您的 ImageView 声明了 findViewById?
  • 你的recordButton在哪里请在你初始化recordButton的地方添加代码
  • 可能你的 record_btn 没有初始化。请添加 onCreate 代码以澄清
  • 添加完整代码,因为这部分代码看起来不错。

标签: java android nullpointerexception


【解决方案1】:

您没有在您的方法中初始化按钮。请首先在您的 onCreate() 方法中执行此操作,或者如果您正在使用片段,则在 onCreateView() 中执行此操作:

ImageView record_btn= findViewById(R.id.record_btn);

【讨论】:

    【解决方案2】:

    请在 onCreate() 中初始化视图 这是工作代码sn-p

    public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
    
    ImageView recordButton;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recordButton = findViewById(R.id.record_btn);
    }
    
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.record_btn:
                Toast.makeText(this, "Called", Toast.LENGTH_SHORT).show();
                recordButton.setImageResource(R.drawable.ic_launcher_foreground);
                break;
    
        }
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2020-11-08
      • 2012-06-27
      • 2017-09-01
      相关资源
      最近更新 更多