0

EditText何らかの理由で、ボックスを長押しすると (データを貼り付けるなど) 、コンテキスト メニューを表示しようとしています。

LogCat は次のとおりです。

01-26 12:00:22.243: E/AndroidRuntime(22300): FATAL EXCEPTION: main
01-26 12:00:22.243: E/AndroidRuntime(22300): java.lang.NullPointerException
01-26 12:00:22.243: E/AndroidRuntime(22300):    at com.---.---.Comments.onCreateContextMenu(Comments.java:352)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View.createContextMenu(View.java:7781)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View.createContextMenu(View.java:7789)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View.createContextMenu(View.java:7789)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:81)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:2201)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2969)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:612)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View.showContextMenu(View.java:4154)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View.performLongClick(View.java:4123)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.widget.TextView.performLongClick(TextView.java:7875)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.view.View$CheckForLongPress.run(View.java:16945)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.os.Handler.handleCallback(Handler.java:615)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.os.Looper.loop(Looper.java:137)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at android.app.ActivityThread.main(ActivityThread.java:4745)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at java.lang.reflect.Method.invokeNative(Native Method)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at java.lang.reflect.Method.invoke(Method.java:511)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-26 12:00:22.243: E/AndroidRuntime(22300):    at dalvik.system.NativeStart.main(Native Method)
01-26 12:00:22.250: W/ActivityManager(291):   Force finishing activity com.---.rat---/.Comments

NullPointer を引き起こす行を含む私の ContextMenu のコード:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    android.view.MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.comments_context, menu);
    menu.setHeaderTitle("Available Actions");

    android.view.MenuItem Edit = menu.findItem(R.id.editComment);
    android.view.MenuItem Delete = menu.findItem(R.id.deleteComment);

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    int position = info.position;
    ListView lv = (ListView) v;
    int firstVisible = lv.getFirstVisiblePosition();
    View rowView = lv.getChildAt(position - firstVisible);

  // this is the line where there is a null pointer.  (Obviousness in an `EditText` box,  this `TextView` doesn't exist!

    ReviewUser = ((TextView) rowView.findViewById(R.id.labelReviewCommentUser)).getText().toString();
    ReviewComment = ((TextView) rowView.findViewById(R.id.labelReviewComment)).getText().toString();


    // Other Stuff Edited Out

}

EditText ボックスが my に作成されますonCreate

EtComment = (EditText) findViewById(R.id.etTweetComment);

の最後にonCreateこれがあります:

registerForContextMenu(getListView());

また、EditText を宣言する場所のすぐ上で、リストビューをセットアップします。

LayoutInflater inflater = this.getLayoutInflater();
        ViewGroup header = (ViewGroup) inflater.inflate(
                R.layout.comment_header, listView, false);

        listView = getListView();
        listView.addHeaderView(header, null, false);
        listView.setClickable(false);
        listView.setTextFilterEnabled(true);

EditTextBox はヘッダーListView( comment_header) にあります。それが重要かどうかはわかりません。

主な質問: EditText を長押しして ContextMenu を登録しようとするのはなぜですか?

編集/更新:

私はCommonsWareがこれに答えると信じています:私はそれのためのコードに苦労しています:

v と getListView() を比較して、同じオブジェクトかどうかを確認してください。そうでない場合は、スーパークラスにチェーンするだけです。

どうやってこれを達成しますか?これを呼び出すregisterForContextMenu(getListView());と、常にそのコードに基づいて念頭に置いて開くとContextMenu思います。そのため、ボックスとボックスListViewを長押ししているかどうかを比較するにはどうすればよいですかListViewEditText

4

1 に答える 1

3

コンテキストメニューダイアログをポップアップして、EditTextウィジェットの長押しを処理できます。通常、このメニューには次のようなものが含まれます。

  • 切る
  • コピー
  • ペースト
  • すべて選択
  • テキストを選択

EditTextを長押ししたときに実行されるアクションは、プラットフォームバージョンのさまざまな違いにより、実行しているデバイスと、さまざまなデバイスに実装されるOEMUIによって異なります。そのため、使用しているデバイスについて詳しく知ることなく、OSコンテキストメニューをポップアップ表示する理由についての一般的な考え方しか説明できません。

于 2013-01-26T20:16:13.720 に答える