【问题标题】:Crash on `onContextItemSelected` above Fragment在 Fragment 上方的 `onContextItemSelected` 上崩溃
【发布时间】:2013-03-06 18:37:54
【问题描述】:

我有一个使用SherlockActionBarFragmentActivity 并支持库v4。

主布局中有一个ListFragment。单击列表项会打开一个新的ListFragment,该ListFragment 会部分滑入视图中。如果您长按这些列表项,则会显示一个包含两个选项的上下文菜单。第一个选项显示带有EditText 框的dialogButton',它在尝试打开时崩溃。

如果我删除EditText 行和Button 行(除非你用findViewById 声明它们),一个空的dialog 会弹出。但出于某种原因,它不喜欢对话框的内容(按钮/框)。任何人都可以查看 LogCat 并了解原因吗? null 的行是 setText 行。如果我将其注释掉,按钮的 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)

【问题讨论】:

  • 您正在创建一个默认 Dialog 并在其中查找一些视图,您预计会发生什么?您可能在对话框中缺少setContentView 来设置包含您要查找的小部件的布局文件。
  • 那是一个丑陋、丑陋的错误。我有一条线被删除了,dialog.setContentView(R.layout.editreview); 我已经把它放回去了,现在它可以工作了。来吧,让它成为正确的答案......
  • 是的,我已经对一条评论和您的回答投了赞成票。但从技术上讲,@Luksprog 的回答更具体到发生了什么,并等待他这样做。如果没有,我会接受你的。

标签: android dialog android-fragments android-contextmenu


【解决方案1】:

查看您的代码,您似乎忘记为新创建的Dialog(带有setContentView(the_layout_file))设置布局(包含您的小部件)。如果您不这样做,那么在对话框中搜索并尝试使用这些小部件将抛出 NullPointerException

【讨论】:

    【解决方案2】:

    看起来好像您未能扩充对话框的 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 中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 2019-01-10
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多