2012-08-05 40 views
9

Tôi có DialogFragment tạo hộp thoại listview và trên mục danh sách, tôi muốn hiển thị hộp thoại cảnh báo nhưng khi tôi tạo hộp thoại, nó cung cấp cho tôi NullPointerException với lỗi mà tôi chưa từng thấy trướcNullPointerException khi tạo Hộp thoại mới

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) 

đây là Dialog tôi 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; 
} 

nó lỗi của hiện tại dòng này trong tôi onClick

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

lỗi đó có nghĩa là gì?

+0

Bạn không thể gọi phương thức 'getActivity()' trong phương thức 'onClick()'. Bạn phải gọi 'Dialog.this.getActivity()'. – tolgap

Trả lời

14

Có thể là do bạn đang cố gắng gọi hàm getActivity() từ bên trong Trình nghe onClick. Thông thường các lớp bên trong ẩn danh như chỉ truy cập vào những thứ là final. Cố gắng ngay trước khi tạo người nghe của bạn để làm một cái gì đó giống như

final Context context = getActivity(); 

và sau đó sử dụng bối cảnh thay vì getActivity() trên dòng treo.

Và làm ghi chú. Tôi sẽ sử dụng DialogFragment tại đây. Nó quản lý vòng đời của Dialog của bạn tốt hơn nhiều. Bạn sẽ gặp phải sự cố khi bạn thử xoay màn hình khi Hộp thoại mở. Tuy nhiên với DialogFragment nó sẽ chăm sóc điều này cho bạn.

2

Hãy thử điều này

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

Cũng bỏ qua hộp thoại cũ sau khi hiển thị hộp thoại mới.

Các vấn đề liên quan