Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-EditText在被(长时间)点击时会显示奇怪的行为_Android_Contextmenu_Gallery - Fatal编程技术网

Android-EditText在被(长时间)点击时会显示奇怪的行为

Android-EditText在被(长时间)点击时会显示奇怪的行为,android,contextmenu,gallery,Android,Contextmenu,Gallery,我的程序基于谷歌的Hello Gallery示例: 我没有使用图像,而是在构造函数中创建了一组EditTexts 我现在的问题是:当我长时间点击编辑文本时,我希望它的上下文菜单(带有“全选”、“复制”等)显示出来。我尝试设置了一个OnItemLongClickListener,它通过myGallery.getAdapter().getView(position,….showContextMenu())调用所选视图,但遇到了一个StackOverflowerError(顺便说一句,这就是我在这里

我的程序基于谷歌的Hello Gallery示例:

我没有使用图像,而是在构造函数中创建了一组
EditText
s

我现在的问题是:当我长时间点击编辑文本时,我希望它的上下文菜单(带有“全选”、“复制”等)显示出来。我尝试设置了一个
OnItemLongClickListener
,它通过
myGallery.getAdapter().getView(position,….showContextMenu()
)调用所选视图,但遇到了一个
StackOverflowerError
(顺便说一句,这就是我在这里发布问题的原因-好的,那是个问题。)

我还尝试了
registerForContextMenu()
the
Gallery
,然后是
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);
    }