我的程序基于Google的Hello Gallery示例:
http://developer.android.com/guide/tutorials/views/hello-gallery.html
我没有使用图像,而是在构造函数中创建了一堆EditText
。
我现在的问题是:当我长时间点击EditText时,我想要显示其上下文菜单(带有“全选”,“复制”等)。我尝试设置OnItemLongClickListener
通过myGallery.getAdapter().getView(position, ...).showContextMenu()
调用所选视图,但是会遇到StackOverflowError
(这就是我在这里发布问题的原因 - 好吧,那个是跛脚):
08-13 16:02:36.062: ERROR/AndroidRuntime(3400): FATAL EXCEPTION: main
java.lang.StackOverflowError
at android.widget.AdapterView.getPositionForView(AdapterView.java:581)
at android.widget.Gallery.showContextMenuForChild(Gallery.java:1049)
at android.view.View.showContextMenu(View.java:2520)
at de.test.gallery2.Main$1.onItemLongClick(Main.java:51)
at android.widget.Gallery.dispatchLongPress(Gallery.java:1074)
at android.widget.Gallery.showContextMenuForChild(Gallery.java:1055)
我还试过registerForContextMenu()
Gallery
,然后是EditTexts
然后两者,但一切都失败了。你们有没有解决方案?
顺便说一句,图库显示了一些其他奇怪的行为:当应用程序启动时,第一个EditText
居中但在点击它时无法编辑。但是当我点击第二个(没有居中)时,我可以编辑那个没有居中的那个。当我居中第二个EditText
时,我只能编辑第三个{... 1}。当我将最后一个放在中心位置时,焦点似乎完全消失,再也无法编辑任何内容了。
m1ntf4n
修改
以下是我的活动代码。对不起双重帖子,没有考虑编辑的可能性。
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Gallery gallery = (Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new LocalAdapter(this));
gallery.setSpacing(50);
registerForContextMenu(gallery);
//Register the EditViews for ContextMenu.
for(int i = 0; i < gallery.getAdapter().getCount(); ++i) {
registerForContextMenu(gallery.getAdapter().getView(i, null, null));
}
//This listener will cause a StackOverflowError.
/*gallery.setOnItemLongClickListener(new Gallery.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> a, View v, int i, long l) {
return gallery.getAdapter().getView(i, null, null).showContextMenu();
}
});*/
}
public class LocalAdapter extends BaseAdapter {
private Context mContext;
private EditText[] editText;
public LocalAdapter(Context c) {
mContext = c;
editText = new EditText[5];
for(int i = 0; i != editText.length; ++i) {
editText[i] = new EditText(mContext);
editText[i].setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
editText[i].setText("TEXT " + i);
editText[i].setTextSize(30);
}
}
@Override
public int getCount() {
return editText.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return editText[position];
}
}
}
答案 0 :(得分:2)
来自Google的文档:
public void registerForContextMenu(View view)
注册要为给定视图显示的上下文菜单(多个 视图可以显示上下文菜单)。这个方法会设置 View.OnCreateContextMenuListener对此活动的视图,所以 将调用onCreateContextMenu(ContextMenu,View,ContextMenuInfo) 什么时候显示上下文菜单。
从文档中可以看出,在显示上下文菜单之前,将在Main中调用onCreateContextMenu()。您需要覆盖此方法以创建自定义上下文菜单。
答案 1 :(得分:0)
谢谢,光荣的哈克。您引导我进入以下解决方案:
在活动的onCreate()
方法中,我们需要registerForContext(myGallery)
。
创建扩展MyEditText
的自己的班级EditText
。在这个类中(当然,在添加构造函数之后),您需要使受保护的方法EditText::onCreateContextMenu()
可访问:
@Override
public void onCreateContextMenu(ContextMenu menu) {
super.onCreateContextMenu(menu);
}
返回活动,执行
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v,
ContextMenu.ContextMenuInfo menuInfo)
{
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
((MyEditText) info.targetView).onCreateContextMenu(contextMenu);
}
第一行是获取请求上下文菜单的视图,第二行是调用onCreateContextMenu()
的(现在可见)EditText
,所以长时间按下用户的上下文菜单曾经出现过。