2013-03-06 57 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)