2015-04-23 64 views
2

我將AppCompat更新爲新發布的修訂版22.1.0,並將我的AlertDialog更改爲support.v7.app.AlertDialog。但在棒棒糖設備上,它會在dismissDialog()上引發以下異常。support.v7.app.AlertDialog在關閉時拋出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) 

我該如何解決?

(低版本的設備似乎運作良好,這是剛剛發生的棒棒糖)

+ 我沒有在我的代碼調用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

你從哪裏得到了你調用'dismiss()'方法的對話框的引用?如果您發佈了代碼片段,這將更容易幫助 –

+2

請發佈您的代碼。沒有它,我們不能回答你的問題。 – Sufian

+0

@KamranAhmed我在問題中添加了最後一行 – hoonj

回答

6

一次偶然的機會我發現我的項目有values-v21/themes.xml,並將其應用於android:Theme.Material.Light.Dialog.Alertsupport.v7.app.AlertDialog。這造成了怪異的錯誤。

使用適當的AppCompat主題,如Theme.AppCompat.Light.Dialog.Alert,到support.v7.app.AlertDialog解決了這個問題。感謝大家幫助我。

+2

我有同樣的問題,你的回答幫助我發現我必須改變哪些屬性來避免這個問題。只需在對話框樣式中設置以下屬性,問題就消失了: false

相關問題