首页 > 解决方案 > 尝试访问对话框片段上的小部件时出现空指针异常

问题描述

我正在尝试对对话片段实现指纹支持。我遵循了 youtube 教程https://www.youtube.com/watch?v=dI9TItdw83U&,但它有如何在新页面而不是对话框上实现指纹。指纹处理器指纹处理器 = 新指纹处理器 (this); 这是错误的说 FingerprintHandler 中的 FingerprintHandler 不能应用于生物识别活动。

我尝试了 getActivity() 而不是这个,但是当我尝试访问对话框中的小部件时,我的应用程序崩溃了,但是当我访问 MainActivity 中的小部件时,它工作正常。

https://gist.github.com/EphraimB/f2c05184690a6aef9536a16b36ad509a

我希望 FingerprintHandler 能够访问和更改 DialogFragment 中的文本,但应用程序崩溃了,并且我在调试器中收到错误消息,指出 FingerprintHandler getViewById(R.id.paraLabel) 正在更改空指针上的文本。

日志信息:

2019-05-15 11:08:53.163 11481-11481/com.example.paay E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.paay, PID: 11481
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at com.example.paay.FingerprintHandler.update(FingerprintHandler.java:52)
        at com.example.paay.FingerprintHandler.onAuthenticationSucceeded(FingerprintHandler.java:45)
        at android.hardware.fingerprint.FingerprintManager$AuthenticationCallback.onAuthenticationSucceeded(FingerprintManager.java:304)
        at android.hardware.fingerprint.FingerprintManager.sendAuthenticatedSucceeded(FingerprintManager.java:1107)
        at android.hardware.fingerprint.FingerprintManager.access$700(FingerprintManager.java:75)
        at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:1030)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:6981)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

标签: javaandroid

解决方案


发生崩溃是因为您想访问R.id.paraLabel活动视图之外的小部件,请在 FingerprintHandler 构造函数中添加一个 TextView

   public FingerprintHandler(Context context,TextView txt) {
    this.context = context;
    this.textview = txt ;
 }

然后在您的更新方法中使用 textview 代替:

 private void update(String s, boolean b) {
    textview .setText(s);

    if (b == false) {
        textview .setTextColor(ContextCompat.getColor(context, R.color.colorAccent));
    }

    else {
        textview.setTextColor(ContextCompat.getColor(context, R.color.colorPrimary));
    }
}

并且 nullpointer 也会发生在您的 imageview 上。


推荐阅读