Android - 图库中的EditTexts在被(长)点击时显示出奇怪的行为

时间:2011-08-13 14:29:46

标签: android contextmenu gallery

我的程序基于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];
        }
    }
}

2 个答案:

答案 0 :(得分:2)

来自Google的文档:

  

public void registerForContextMenu(View view)

     

注册要为给定视图显示的上下文菜单(多个   视图可以显示上下文菜单)。这个方法会设置   View.OnCreateContextMenuListener对此活动的视图,所以   将调用onCreateContextMenu(ContextMenu,View,ContextMenuInfo)   什么时候显示上下文菜单。

从文档中可以看出,在显示上下文菜单之前,将在Main中调用onCreateContextMenu()。您需要覆盖此方法以创建自定义上下文菜单。

答案 1 :(得分:0)

谢谢,光荣的哈克。您引导我进入以下解决方案:

  1. 在活动的onCreate()方法中,我们需要registerForContext(myGallery)

  2. 创建扩展MyEditText的自己的班级EditText。在这个类中(当然,在添加构造函数之后),您需要使受保护的方法EditText::onCreateContextMenu()可访问:

    @Override
    public void onCreateContextMenu(ContextMenu menu) {
        super.onCreateContextMenu(menu);
    }
    
  3. 返回活动,执行

    @Override
    public void onCreateContextMenu(ContextMenu contextMenu, View v, 
                                    ContextMenu.ContextMenuInfo menuInfo) 
    {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        ((MyEditText) info.targetView).onCreateContextMenu(contextMenu);
    }
    

    第一行是获取请求上下文菜单的视图,第二行是调用onCreateContextMenu()的(现在可见)EditText,所以长时间按下用户的上下文菜单曾经出现过。