2015-04-23 3 views
2

Я обновил AppCompat только что выпущенной редакции 22.1.0 и сменил мой AlertDialog на support.v7.app.AlertDialog. Но на устройстве Lollipop оно генерирует следующее исключение: dismissDialog().support.v7.app.AlertDialog throws NullPointerException при увольнении

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) 

Как исправить это?

(Lower-версия устройства, кажется, работает хорошо. Это просто происходит в Lollipop)

+ Я не называю dismiss() явно в моем коде. Диалоговое окно выдает исключение, когда оно отклоняется кнопкой «назад» или «положительная/отрицательная».

++ Это мой код, который использует v7.app.AlertDialog. Спасибо.

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(); 
    } 
} 
+1

Откуда вы получили ссылку на диалог, на который вы вызвали метод 'free()? Если вы разместите фрагмент кода, вам будет легче помочь –

+2

Пожалуйста, разместите свой код. Мы не можем ответить на ваш вопрос без него. – Sufian

+0

@KamranAhmed Я добавил последнюю строку в вопрос – hoonj

ответ

6

Случайно я заметил, что мой проект имеет values-v21/themes.xml и это относится android:Theme.Material.Light.Dialog.Alert к support.v7.app.AlertDialog. Это вызвало странную ошибку.

Используя подходящую тему AppCompat, такую ​​как Theme.AppCompat.Light.Dialog.Alert, на support.v7.app.AlertDialog решена проблема. Спасибо всем за то, что помогли мне.

+2

У меня была такая же проблема, и ваш ответ помог мне узнать, какой атрибут мне пришлось изменить, чтобы избежать проблемы. Просто установите следующий атрибут в стиле вашего диалога, и проблема исчезла: false

Смежные вопросы