support.v7.app.AlertDialog引发NullPointerException异常上驳回 [英] support.v7.app.AlertDialog throws NullPointerException on dismiss

查看:3325
本文介绍了support.v7.app.AlertDialog引发NullPointerException异常上驳回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我更新 AppCompat 至新发行版 22.1.0 ,改变了我的 AlertDialog support.v7.app.AlertDialog 。但是棒棒糖设备上,它抛出的 dismissDialog以下异常()

 显示java.lang.NullPointerException:试图在一个空对象引用调用虚方法的java.lang.Class java.lang.Object.getClass()
  在android.support.v7.internal.app.WindowDecorActionBar.getDecorToolbar(WindowDecorActionBar.java:248)
  在android.support.v7.internal.app.WindowDecorActionBar.init(WindowDecorActionBar.java:201)
  在android.support.v7.internal.app.WindowDecorActionBar< INIT>(WindowDecorActionBar.java:184)
  在android.support.v7.app.AppCompatDeleg ateImplV7.cre ateSupportActionBar(AppCompatDelegateImplV7.java:176)
  在android.support.v7.app.AppCompatDelegateImplBase.getSupportActionBar(AppCompatDelegateImplBase.java:85)
  在android.support.v7.app.AppCompatDelegateImplV7.onStop(AppCompatDeleg ateImplV7.java:221)
  在android.support.v7.app.AppCompatDialog.onStop(AppCompatDialog.java:108)
  在android.app.Dialog.dismissDialog(Dialog.java:438)
  在android.app.Dialog.dismiss(Dialog.java:414)
  在android.support.v7.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:157)
  在android.os.Handler.dispatchMessage(Handler.java:102)
  在android.os.Looper.loop(Looper.java:145)
  在android.app.ActivityThread.main(ActivityThread.java:5834)
  在java.lang.reflect.Method.invoke(本机方法)
  在java.lang.reflect.Method.invoke(Method.java:372)
  在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1388)
  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
 

如何解决呢?

(下版本的设备似乎运作良好。这只是发生在棒棒堂)

+ 我不叫辞退()明确地在我的code。该对话框抛出异常时,它被后退按钮或正/负键驳回。

+ 这是我的一个使用v7.app.AlertDialog code。谢谢你。

 进口android.app.Dialog;
进口android.content.DialogInterface;
进口android.content.DialogInterface.OnClickListener;
进口android.os.Bundle;
进口android.support.v4.app.DialogFragment;
进口android.support.v7.app.AlertDialog;
进口android.text.TextUtils;

公共类SimpleYesNoFragment扩展DialogFragment {

    公共接口OnConfirmListner {
        公共无效onConfirm();
    }

    公共静态SimpleYesNoFragment的newInstance(标题字符串,字符串消息){
        SimpleYesNoFragment片段=新SimpleYesNoFragment();
        捆绑的args =新包();
        args.putString(题,题);
        args.putString(消息,消息);
        fragment.setArguments(参数);

        返回片段;
    }

    私人OnConfirmListner mListener;

    公共无效setOnConfirmListener(OnConfirmListner L){
        mListener =升;
    }

    @覆盖
    公共对话onCreateDialog(包savedInstanceState){
        AlertDialog.Builder B =新AlertDialog.Builder(getActivity())
        .setPositiveButton(R.string.yes,新OnClickListener(){

            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){
                如果(mListener!= NULL){
                    mListener.onConfirm();
                }
            }
        })
        .setNegativeButton(R.string.no,新OnClickListener(){
            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){
            }
        });

        捆绑的args = getArguments();
        字符串标题= args.getString(标题,NULL);
        如果(!TextUtils.isEmpty(标题)){
            b.setTitle(职称);
        }
        字符串消息= args.getString(信息,NULL);
        如果(!TextUtils.isEmpty(消息)){
            b.setMessage(消息);
        }

        返回b.create();
    }
}
 

解决方案

一个偶然的机会我发现我的项目有值-V21 /的themes.xml ,并将其应用于安卓Theme.Material.Light.Dialog.Alert support.v7.app.AlertDialog 。这引起了奇怪的问题。

使用适当的AppCompat主题,如 Theme.AppCompat.Light.Dialog.Alert ,到 support.v7.app.AlertDialog 解决了这个问题。感谢大家的帮助我。

I updated AppCompat to the newly released revision 22.1.0 and changed my AlertDialog to support.v7.app.AlertDialog. But on a Lollipop device, it throws the following exception on dismissDialog().

java.lang.NullPointerException:   attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
  at android.support.v7.internal.app.WindowDecorActionBar.getDecorToolbar(WindowDecorActionBar.java:248)
  at android.support.v7.internal.app.WindowDecorActionBar.init(WindowDecorActionBar.java:201)
  at android.support.v7.internal.app.WindowDecorActionBar.<init>(WindowDecorActionBar.java:184)
  at android.support.v7.app.AppCompatDeleg  ateImplV7.cre  ateSupportActionBar(AppCompatDelegateImplV7.java:176)
  at android.support.v7.app.AppCompatDelegateImplBase.getSupportActionBar(AppCompatDelegateImplBase.java:85)
  at android.support.v7.app.AppCompatDelegateImplV7.onStop(AppCompatDeleg  ateImplV7.java:221)
  at android.support.v7.app.AppCompatDialog.onStop(AppCompatDialog.java:108)
  at android.app.Dialog.dismissDialog(Dialog.java:438)
  at android.app.Dialog.dismiss(Dialog.java:414)
  at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:145)
  at android.app.ActivityThread.main(ActivityThread.java:5834)
  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:1388)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

How do I fix it?

(Lower-version devices seems to work well. This just happens in Lollipop)

+ I don't call dismiss() explicitly in my code. The dialog throws the exception when it is dismissed by back-button or positive/negative button.

++ Here is my code that uses v7.app.AlertDialog. Thank you.

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;

public class SimpleYesNoFragment extends DialogFragment {

    public interface OnConfirmListner {
        public void onConfirm();
    }

    public static SimpleYesNoFragment newInstance(String title, String message) {
        SimpleYesNoFragment fragment = new SimpleYesNoFragment();
        Bundle args = new Bundle();
        args.putString("title", title);
        args.putString("message", message);
        fragment.setArguments(args);

        return fragment;
    }

    private OnConfirmListner mListener;

    public void setOnConfirmListener(OnConfirmListner l) {
        mListener = l;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder b=  new  AlertDialog.Builder(getActivity())
        .setPositiveButton(R.string.yes, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                if(mListener != null) {
                    mListener.onConfirm();
                }
            }
        })
        .setNegativeButton(R.string.no, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });

        Bundle args = getArguments();
        String title = args.getString("title",null);
        if(!TextUtils.isEmpty(title)) {
            b.setTitle(title);
        }
        String message = args.getString("message",null);
        if(!TextUtils.isEmpty(message)) {
            b.setMessage(message);
        }

        return b.create();
    }
}

解决方案

By chance I've noticed that my project has values-v21/themes.xml and it applies android:Theme.Material.Light.Dialog.Alert to the support.v7.app.AlertDialog. This caused the weird bug.

Using a proper AppCompat Theme, such as Theme.AppCompat.Light.Dialog.Alert, to the support.v7.app.AlertDialog solved the problem. Thanks to everyone for helping me out.

这篇关于support.v7.app.AlertDialog引发NullPointerException异常上驳回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆