2012-08-05 5 views
9

Ho un DialogFragment che crea una finestra di dialogo listview e su un elemento dell'elenco fai clic su Voglio visualizzare una finestra di avviso ma quando creo il dialogo mi dà un NullPointerException con un errore che non ho mai visto primaNullPointerException quando si crea un nuovo Dialog

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) 

Ecco il mio dialogo 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; 
} 

è l'errore di fuori a questa linea nella mia onClick

AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); 

cosa significa questo errore?

+0

Non è possibile chiamare 'getActivity()' nel metodo 'onClick()'. Devi chiamare 'Dialog.this.getActivity()'. – tolgap

risposta

14

Potrebbe essere perché si sta tentando di chiamare getActivity() da un Listener onClick. Classi interne tipicamente anonime preferiscono accedere solo alle cose che sono finale. Provando a destra prima di creare il vostro ascoltatore a fare qualcosa di simile

final Context context = getActivity(); 

e quindi utilizzare contesto invece di getActivity() sulla linea che si blocca.

E come nota. Vorrei usare DialogFragment qui. Gestisce molto meglio il ciclo di vita del tuo Dialog. Ti imbatterai in problemi quando proverai a ruotare lo schermo quando la finestra di dialogo è aperta. Tuttavia con DialogFragment si prenderà cura di questo per te.

2

Prova questa

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

respingere anche la vecchia finestra di dialogo dopo aver mostrato nuova finestra di dialogo.