Android-EditText在被(长时间)点击时会显示奇怪的行为
我的程序基于谷歌的Hello Gallery示例:Android-EditText在被(长时间)点击时会显示奇怪的行为,android,contextmenu,gallery,Android,Contextmenu,Gallery,我的程序基于谷歌的Hello Gallery示例: 我没有使用图像,而是在构造函数中创建了一组EditTexts 我现在的问题是:当我长时间点击编辑文本时,我希望它的上下文菜单(带有“全选”、“复制”等)显示出来。我尝试设置了一个OnItemLongClickListener,它通过myGallery.getAdapter().getView(position,….showContextMenu())调用所选视图,但遇到了一个StackOverflowerError(顺便说一句,这就是我在这里
我没有使用图像,而是在构造函数中创建了一组
EditText
s
我现在的问题是:当我长时间点击编辑文本时,我希望它的上下文菜单(带有“全选”、“复制”等)显示出来。我尝试设置了一个OnItemLongClickListener
,它通过myGallery.getAdapter().getView(position,….showContextMenu()
)调用所选视图,但遇到了一个StackOverflowerError
(顺便说一句,这就是我在这里发布问题的原因-好的,那是个问题。)
我还尝试了registerForContextMenu()
theGallery
,然后是editText
,然后是两者,但都失败了。你们当中有人有解决办法吗?顺便说一下,库中还显示了一些其他奇怪的行为:当应用程序启动时,第一个
EditText
居中,但当我轻触它时无法编辑。但当我点击第二个(不居中)时,我可以编辑它而不居中。当我将第二个EditText
居中时,我只能编辑第三个,依此类推。当我将最后一个居中时,焦点似乎完全消失,无法再编辑任何内容。如果你能帮助我,我可能会嫁给你。感谢您的帮助。相信我,在问这个问题之前,我做了很多研究。真的。
非常感谢
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];
}
}
}
public类主扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
最终画廊画廊=(画廊)findViewById(R.id.Gallery);
setAdapter(新的LocalAdapter(this));
画廊(50);
registerForContextMenu(图库);
//注册ContextMenu的编辑视图。
对于(int i=0;i
来自谷歌文档:
公共无效注册表ForContextMenu(视图)
注册要为给定视图显示的上下文菜单(多个
视图可以显示关联菜单)。此方法将设置
查看此活动的视图上的View.OnCreateContextMenuListener,因此
将调用onCreateContextMenu(ContextMenu、View、ContextMenuInfo)
何时显示关联菜单
从文档中可以看到,在显示上下文菜单之前,将在Main中调用onCreateContextMenu()。您需要重写此方法来创建自定义上下文菜单。谢谢,glorifiedHacker。您让我找到了以下解决方案:
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);
}
第一行是获取请求上下文菜单的视图,第二行是调用EditText
的onCreateContextMenu()
,因此长按一下用户用来显示的上下文菜单除了简单地发布堆栈跟踪的一部分,您还可以发布相关代码吗?特别是,我感兴趣的是在哪里调用registerForContextMenu()以及在哪里重写onCreateContextMenu()。嗯,我根本不重写onCreateContextMenu。我不认为这是必要的,因为它也不适用于不在图库中的EditText。这是问题吗?这当然是问题的一部分,尽管我不能肯定这是整个问题。我在下面的谷歌文档中引用了一段话来帮助解释。非常感谢glorifiedHacker。这让我找到了下面发布的解决方案。我没有看到这一点,因为EditText有自己的onCreateContextMenu()方法,所以我没有想到有必要重写活动的onCreateContextMenu。P.s.:我仍然不知道当EditText的上下文菜单不在库中时如何自动调用它。显然,视图可以处理它的上下文
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v,
ContextMenu.ContextMenuInfo menuInfo)
{
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
((MyEditText) info.targetView).onCreateContextMenu(contextMenu);
}