По какой-то причине он пытается вызвать контекстное меню, когда я долго нажимаю поле 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
?
TextView
НЕ существует внутри поляEditText
. Главный вопрос: почему он пытается зарегистрировать ContextMenu, долго нажимаяEditText
? - person TheLettuceMaster   schedule 27.01.2013ContextMenu
дляEditText
— он уже сделал это. ~99% устройств Android имеют системное контекстное меню (или режим действий на более новых устройствах) дляEditText
. Если вы используетеContextMenu
, изучите параметрView v
дляonCreateContextMenu()
и работайте только со своим, просто привязываясь к суперклассу для остальных. - person CommonsWare   schedule 27.01.2013ContextMenu
в моем ListView мешает работе системы. Я использую View v только в своем onCreateContext --ListView lv = (ListView) view
. Я не вижу, где еще это может мешать? - person TheLettuceMaster   schedule 27.01.2013onCreateContextMenu()
вызывается для всех контекстных меню в этом действии. У вас происходит сбой, потому что вы предполагаете, что контекстное меню создается дляListView
, и это не всегда будет иметь место для этого действия. Пожалуйста, сравнитеv
сgetListView()
, чтобы увидеть, являются ли они одним и тем же объектом или нет. Если это не так, просто привяжите к суперклассу. - person CommonsWare   schedule 27.01.2013v
иgetListView()
внутриonCreateContext
, и всегда было одно и то же: виджетListView
. Затем я понял, что это, вероятно, потому, что я вызываюgetListView()
КАЖДЫЙ раз, когда регистрируется контекстное меню. Итак, я предполагаю, что я сделал сравнение раньше? Если да, то с чем мне сравнитьgetListView()
, если v еще не инициализирован? Есть ли способ получить текущий вид - или я слишком много думаю об этом? - person TheLettuceMaster   schedule 27.01.2013