2012-08-05 20 views
9

Bir liste görüntüleme iletişim kutusu ve bir liste öğesinde tıklattıran bir iletişim kutusu tıklattığımda bir iletişim kutusu iletişim kutusunu görüntülediğim bir iletişim kutusu var, ancak iletişim kutusu oluşturduğumda bana daha önce hiç görmediğim bir hatayla bana bir NullPointerException verir. İşteNullPointerException yeni bir iletişim kutusu oluştururken

08-05 11:40:42.315: E/AndroidRuntime(4693): java.lang.NullPointerException 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at com.tyczj.bowling.dialogs.SeasonType$1$1.onClick(SeasonType.java:60) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at android.os.Looper.loop(Looper.java:137) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-05 11:40:42.315: E/AndroidRuntime(4693):  at dalvik.system.NativeStart.main(Native Method) 

benim Diyalog adlı onCreate

@Override 
public Dialog onCreateDialog(Bundle state){ 
    final Dialog d = new Dialog(getActivity()); 
    d.setContentView(R.layout.dialog_layout); 
    d.setTitle("Select a season"); 
    ListView lv = (ListView)d.findViewById(R.id.dialog_list); 
    String[] list = getResources().getStringArray(R.array.season_dialog_type); 
    lv.setAdapter(new ArrayAdapter<String>(getActivity(),R.layout.stats_list_layout,list)); 
    lv.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { 
      d.dismiss(); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      if(arg2 == 0){ 
       DialogFragment df = new SeasonsDialog(true); 
       df.show(ft,null); 
      }else if(arg2 == 1){ 
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
       final View v = getActivity().getLayoutInflater().inflate(R.layout.add_season_layout, null, false); 
       builder.setTitle("Add a season").setView(v).setPositiveButton("Add", new OnClickListener(){ 

        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         arg0.dismiss(); 
         AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); //Error here 
         builder2.setTitle("Warning!").setMessage("Adding a new season will cause all new games to be under this season.\n\n Do you wish to continue?") 
         .setPositiveButton("Yes", new OnClickListener(){ 

          @Override 
          public void onClick(DialogInterface dialog,int which) { 
           dialog.dismiss(); 
           EditText et = (EditText)v.findViewById(R.id.editText1); 
           ContentValues values = new ContentValues(); 
           values.put(Games.SEASON, et.getText().toString()); 
           Uri uri = getActivity().getContentResolver().insert(Games.SEASONS_URI, values); 
           et.setText(""); 
           SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
           SharedPreferences.Editor edit = pref.edit(); 
           edit.putLong(Preferences.SELECTED_SEASON, ContentUris.parseId(uri)).commit(); 
          } 

         }).setNegativeButton("No", new OnClickListener(){ 

          @Override 
          public void onClick(DialogInterface dialog,int which) { 
           dialog.dismiss(); 
          } 

         }).create().show(); 
        } 

       }).setNegativeButton("Cancel", new OnClickListener(){ 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 

       }).create().show(); 
      } 

     } 

    }); 

    return d; 
} 

önce benim onClick

bu çizgide 's dışarı hata
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); 

Bu hata ne anlama geliyor?

+0

'onClick()' yönteminde 'getActivity()' diyemezsiniz. Dialog.this.getActivity() 'yi çağırmalısınız. – tolgap

cevap

14

Bu, bir onClick Listener içinden getActivity() öğesini çağırmaya çalıştığınız için olabilir. Genellikle Anonim iç sınıflar sadece son olan şeylere erişmeyi sever. Çalışılıyor sağ

final Context context = getActivity(); 

böyle bir şey yapmak ve sonra çöküyor hattında yerine getActivity() ait bağlamını kullanmak için dinleyici oluşturmadan önce.

Ve bir not olarak. DialogFragment'u burada kullanırdım. Dialog'unuzun yaşam döngüsünü çok daha iyi yönetir. İletişim Kutusu açıkken ekranı döndürmeyi denediğinizde sorunlarınızla karşılaşacaksınız. Ancak DialogFragment ile bunun sizin için halledecektir.

2

bu

AlertDialog alrt = (AlertDialog)arg0; 
AlertDialog.Builder builder = new AlertDialog.Builder(alrt.getContext()); 

Ayrıca yeni iletişim göstermeden sonra eski iletişim kutusunu kapatmak deneyin.