2013-03-06 56 views
0

我有一個FragmentActivity使用SherlockActionBar和支持庫v4。上面的`onContextItemSelected`上的崩潰

主佈局中有一個ListFragment。點擊列表項目打開一個新的ListFragment,部分滑入視圖。如果您長按「THOSE」列表項目,上下文菜單將顯示兩個選項。第一個選項顯示dialogEditText框和Button「它試圖打開時崩潰。

如果我刪除EditText行和Button行(除非您聲明它們的地址爲findViewById),則會彈出一個空的dialog。但由於某種原因,它不喜歡對話框的內容(按鈕/框)。任何人都可以看看LogCat,看看爲什麼?該線是nullsetText線。如果我將它註釋掉,按鈕的onClickListner將變爲null

這是代碼和logcat。

public boolean onContextItemSelected(android.view.MenuItem item) { 

     if (item.getGroupId() == 2) { 

      switch (item.getItemId()) { 

      case 1: 


case 1: 

       if (Rateit.isUserLoggedIn == true) { 

        final Dialog dialog = new Dialog(getActivity()); 
        dialog.setTitle("Edit Review"); 
        dialog.show(); 

        final EditText etEdit = (EditText) dialog 
          .findViewById(R.id.etEditReview); 

        etEdit.setText(reviewWords); 

        Button bInsert = (Button) dialog.findViewById(R.id.bInsert); 
        bInsert.setOnClickListener(new OnClickListener() { 

         public void onClick(View v) { 

          clickedReview = etEdit.getText().toString(); 

          if (clickedReview.equals("")) { 

           Toast.makeText(getActivity(), 
             "Please add something first.", 
             Toast.LENGTH_SHORT).show(); 

          } else { 
           newReview = etEdit.getText().toString(); 
           new EditCommentTask().execute(); 

           InputMethodManager imm = (InputMethodManager) getActivity() 
             .getSystemService(
               Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(
             etEdit.getWindowToken(), 0); 

           dialog.dismiss(); 

          } 

         } 
        }); 

       } 

       return true; 

的logcat:

03-06 10:29:08.527: E/AndroidRuntime(10438): FATAL EXCEPTION: main 
03-06 10:29:08.527: E/AndroidRuntime(10438): java.lang.NullPointerException 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.---.---.RateReviewFragment.onContextItemSelected(RateReviewFragment.java:901) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:1933) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:360) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(SherlockFragmentActivity.java:211) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:3633) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.widget.AbsListView$1.run(AbsListView.java:3423) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.os.Handler.handleCallback(Handler.java:725) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.os.Looper.loop(Looper.java:137) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at android.app.ActivityThread.main(ActivityThread.java:5226) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at java.lang.reflect.Method.invokeNative(Native Method) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at java.lang.reflect.Method.invoke(Method.java:511) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
03-06 10:29:08.527: E/AndroidRuntime(10438): at dalvik.system.NativeStart.main(Native Method) 
+1

你正在創建一個**默認的**'Dialog'並在其中尋找一些視圖,你預期會發生什麼?您可能在對話框中缺少一個'setContentView'來設置包含您所尋找的小部件的佈局文件。 – Luksprog 2013-03-06 18:48:34

+0

這是一個醜陋,醜陋的錯誤。我有一條被刪除的行,'dialog.setContentView(R.layout.editreview);'我把它放回去了,現在它可以工作。繼續,並做出正確的答案... – KickingLettuce 2013-03-06 18:54:25

+0

是的,我已經upvoted一個評論和你的答案。但從技術上來說@盧克斯普羅克的答案更具體到發生了什麼,並等待他這樣做。如果沒有,我會接受你的。 – KickingLettuce 2013-03-06 20:05:57

回答

1

看你的代碼,似乎你可能忘了設置爲新創建的Dialog(與setContentView(the_layout_file))佈局(含小部件)。如果你不這樣做,那麼在對話框中搜索並嘗試使用這些小部件將會拋出一個NullPointerException

1

看起來好像你不能誇大對話框的XML, 我想你爲那個對話框中的XML,所以你應該做這樣的事情:

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View layout = inflater.inflate(R.layout.instructions, (ViewGroup) activity.findViewById(R.id.layout_root)); 
builder = new AlertDialog.Builder(mContext); 
builder.setView(layout); 
Button bInsert = (Button) layout.findViewById(R.id.bInsert); 
alertDialog = builder.create(); 
alertDialog.show(); 

,你會把

mContext=this; 

中的onCreate()(如果你在你的Activity)