[英]Android: How to make a clickable ListView with a ContextMenu?
I have a clickable ListView
and try to make a Context Menu for the Items but if I get a long click the first time it activates the onListItemClick
Method instead. 我有一个可单击的
ListView
并尝试为Items创建一个上下文菜单,但是如果我第一次单击很长,它将激活onListItemClick
方法。 The next time it works. 下次可以使用。 If I activate the Context Menu with
openContextMenu
it throws a StackOverflowError
. 如果我使用
openContextMenu
激活上下文菜单, openContextMenu
抛出StackOverflowError
。
I resolved my problem! 我解决了我的问题! See at the end of this post.
请参阅本文末尾。
My Activity: 我的活动:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.search);
getWords(getIntent());
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String lemma = (item.get(position));
Intent intent = new Intent(this, EntryActivity.class)
.putExtra(CL.DOC, doc)
.putExtra(CL.ENTRY, lemma);
startActivity(intent);
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Eintrag");
getMenuInflater().inflate(R.menu.context, menu);
}
public boolean onContextItemSelected(MenuItem item) {
//TODO: switch
return super.onContextItemSelected(item);
}
private void getWords(Intent intent) {
doc = (CLDocument)intent.getSerializableExtra(CL.DOC);
item = doc.getEntries();
ArrayAdapter<String> fileList =
new ArrayAdapter<String>(this, R.layout.row, item);
setListAdapter(fileList);
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
registerForContextMenu(view);
//openContextMenu(view);
return false;
}
});
}
My Layout (search.xml): 我的版式(search.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edit_search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:imeOptions="actionSearch"
android:inputType="text"
android:singleLine="true" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/nowords"
/>
</LinearLayout>
edit: Here is the logcat if I activate openContextMenu
: 编辑:这是logcat,如果我激活
openContextMenu
:
04-17 11:31:06.103: D/dalvikvm(279): GC_FOR_MALLOC freed 5691 objects / 348744 bytes in 65ms
04-17 11:31:08.553: I/dalvikvm(279): threadid=1: stack overflow on call to Landroid/widget/AbsListView;.showContextMenuForChild:ZL
04-17 11:31:08.553: I/dalvikvm(279): method requires 36+20+24=80 bytes, fp is 0x42089340 (64 left)
04-17 11:31:08.564: I/dalvikvm(279): expanding stack end (0x42089300 to 0x42089000)
04-17 11:31:08.564: I/dalvikvm(279): Shrank stack (to 0x42089300, curFrame is 0x4208beb8)
04-17 11:31:08.573: D/AndroidRuntime(279): Shutting down VM
04-17 11:31:08.573: W/dalvikvm(279): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-17 11:31:08.703: D/dalvikvm(279): GC_FOR_MALLOC freed 7370 objects / 493888 bytes in 50ms
04-17 11:31:08.733: E/AndroidRuntime(279): FATAL EXCEPTION: main
04-17 11:31:08.733: E/AndroidRuntime(279): java.lang.StackOverflowError
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1779)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.view.View.showContextMenu(View.java:2444)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.app.Activity.openContextMenu(Activity.java:2390)
04-17 11:31:08.733: E/AndroidRuntime(279): at de.solich.cldic.SearchActivity$1.onItemLongClick(SearchActivity.java:99)
04-17 11:31:08.733: E/AndroidRuntime(279): at android.widget.AbsListView.showC
04-17 11:31:08.823: D/dalvikvm(279): GC_FOR_MALLOC freed 3648 objects / 486736 bytes in 50ms
I changed the methods getWords
and onCreateContextMenu
and now it works: 我更改了方法
getWords
和onCreateContextMenu
,现在可以使用:
private void getWords(Intent intent) {
doc = (CLDocument)intent.getSerializableExtra(CL.DOC);
item = doc.getEntries();
ArrayAdapter<String> fileList =
new ArrayAdapter<String>(this, R.layout.row, item);
setListAdapter(fileList);
registerForContextMenu(getListView());
// getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
// @Override
// public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
// registerForContextMenu(view);
//
// return false;
// }
// });
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo)menuInfo;
menu.setHeaderTitle(item.get(info.position));
getMenuInflater().inflate(R.menu.context, menu);
}
So thanks to all who tried to help me! 因此,感谢所有尝试帮助我的人!
您必须将ListView
作为活动的onCreate()
回调中的参数调用registerForContextMenu
。
Here: getListView().setOnItemLongClickListener(...)
after long click you register for the context menu ( registerForContextMenu(view)
), so it will work only the next time. 此处:长时间单击后,您会注册上下文菜单(
registerForContextMenu(view)
)的getListView().setOnItemLongClickListener(...)
),因此它将仅在下一次运行。 However if you want the context menu to work from the beginning, you should call this earlier, for example before that the registerForContextMenu(getListView())
method. 但是,如果希望上下文菜单从头开始工作,则应更早调用此菜单,例如,在
registerForContextMenu(getListView())
方法之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.