Длительное нажатие EditText вызывает сбой

По какой-то причине он пытается вызвать контекстное меню, когда я долго нажимаю поле EditText (например, для вставки данных).

Вот ЛогКэт:

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

Код моего ContextMenu со строкой, вызывающей NullPointer:

@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 создается в моем onCreate:

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

В самом конце onCreate это:

ЗарегистрироватьсяForContextMenu(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);

Поле EditText находится в заголовке ListView (comment_header). Не уверен, что это имеет значение.

Основной вопрос: Почему он пытается зарегистрировать ContextMenu долгим нажатием на EditText?

ИЗМЕНИТЬ/ОБНОВИТЬ:

Я верю, что CommonsWare отвечает на это сейчас, я борюсь с кодом для него:

Пожалуйста, сравните v с getListView(), чтобы увидеть, являются ли они одним и тем же объектом или нет. Если это не так, просто привяжите к суперклассу.

Как вы этого добиваетесь? Когда я вызываю это, я полагаю, что registerForContextMenu(getListView()); он ВСЕГДА будет открывать ContextMenu с учетом ListView на основе этого кода, так как я могу провести сравнение, долго ли я нажимаю поле ListView против поля EditText?


person TheLettuceMaster    schedule 26.01.2013    source источник
comment
Я не понимаю вашего комментария. Какая строка в приведенном выше коде 352?   -  person FoamyGuy    schedule 27.01.2013
comment
NPE может быть вызвано тем, что (а) TextView не существует, или (б) метод getText() возвращает значение null. Почему бы вам не изучить это?   -  person EJK    schedule 27.01.2013
comment
@FoamyGuy Первая строка после того, где я говорю // это строка, в которой есть нулевой указатель.   -  person TheLettuceMaster    schedule 27.01.2013
comment
@EJK Да, TextView НЕ существует внутри поля EditText. Главный вопрос: почему он пытается зарегистрировать ContextMenu, долго нажимая EditText?   -  person TheLettuceMaster    schedule 27.01.2013
comment
Он не пытается зарегистрировать ContextMenu для EditText — он уже сделал это. ~99% устройств Android имеют системное контекстное меню (или режим действий на более новых устройствах) для EditText. Если вы используете ContextMenu, изучите параметр View v для onCreateContextMenu() и работайте только со своим, просто привязываясь к суперклассу для остальных.   -  person CommonsWare    schedule 27.01.2013
comment
@CommonsWare Хорошо, я понимаю, что вы говорите .... ContextMenu в моем ListView мешает работе системы. Я использую View v только в своем onCreateContext -- ListView lv = (ListView) view. Я не вижу, где еще это может мешать?   -  person TheLettuceMaster    schedule 27.01.2013
comment
onCreateContextMenu() вызывается для всех контекстных меню в этом действии. У вас происходит сбой, потому что вы предполагаете, что контекстное меню создается для ListView, и это не всегда будет иметь место для этого действия. Пожалуйста, сравните v с getListView(), чтобы увидеть, являются ли они одним и тем же объектом или нет. Если это не так, просто привяжите к суперклассу.   -  person CommonsWare    schedule 27.01.2013
comment
Я полностью понимаю, что происходит, и что нужно делать сейчас, спасибо! Вот где я нахожусь: я сравнивал v и getListView() внутри onCreateContext, и всегда было одно и то же: виджет ListView. Затем я понял, что это, вероятно, потому, что я вызываю getListView() КАЖДЫЙ раз, когда регистрируется контекстное меню. Итак, я предполагаю, что я сделал сравнение раньше? Если да, то с чем мне сравнить getListView(), если v еще не инициализирован? Есть ли способ получить текущий вид - или я слишком много думаю об этом?   -  person TheLettuceMaster    schedule 27.01.2013
comment
Вы нашли решение этой проблемы?   -  person Martynas Jurkus    schedule 11.04.2016


Ответы (1)


Он может открывать диалоговое окно ContextMenu для обработки длительного нажатия на виджет EditText. Как правило, это меню будет содержать такие вещи, как:

  • Резать
  • Копировать
  • Вставить
  • Выбрать все
  • Выберите текст

Действие, предпринимаемое при длительном нажатии на EditText, зависит от устройства, на котором вы работаете, из-за различных различий в версиях платформы и пользовательского интерфейса OEM, которые реализуются на разных устройствах. Поэтому, не зная больше о том, на каком устройстве вы находитесь, я могу только дать общее представление о том, почему ОС может открывать контекстное меню.

person FoamyGuy    schedule 26.01.2013
comment
Проведя множество исследований и, в конечном итоге, прислушавшись к Commonsware, вы правы. Теперь осталось понять, как это реализовать... - person TheLettuceMaster; 02.02.2013