2012-08-05 2 views
9

목록보기 대화 상자를 만들고 목록 항목에서 경고 대화 상자를 표시하는 DialogFragment가 있지만 대화 상자를 만들 때 본 적이없는 오류가있는 NullPointerException이 표시됩니다 여기NullPointerException 새 대화 상자를 만들 때

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) 

내 대화의 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; 
} 

전에 내 onClick

이 라인에서의 아웃 오류3210
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); 

그 오류는 무엇을 의미합니까?

+0

'onClick()'메소드에서'getActivity()'를 호출 할 수 없습니다. Dialog.this.getActivity()를 호출해야합니다. – tolgap

답변

14

onClick Listener 내에서 getActivity()를 호출하려고했기 때문일 수 있습니다. 일반적으로 익명의 내부 클래스는 최종 일에만 액세스하려고합니다. 시도 바로

final Context context = getActivity(); 

처럼 뭔가를하고 충돌 라인에 대신 getActivity()의 상황를 사용하도록 리스너를 작성하기 전에.

메모로. 여기에 DialogFragment을 사용합니다. Dialog의 수명주기를 훨씬 잘 관리합니다. 대화 상자가 열려있을 때 화면을 회전하려고하면 문제가 발생합니다. DialogFragment를 사용하면이 문제가 해결됩니다.

2

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

는 또한 새로운 대화 상자를 표시 한 후 이전 대화 상자를 닫습니다보십시오.

관련 문제