Android “软键盘”;del";在库小部件上的EditText中键失败

Android “软键盘”;del";在库小部件上的EditText中键失败,android,widget,gallery,android-edittext,Android,Widget,Gallery,Android Edittext,我正在使用androidsdk2.2在eclipsebuildid20090920-1017中开发一个应用程序,并在googlenexusone上进行测试。出于以下测试的目的,我在非根手机上使用输入法“Android键盘” 我有一个EditText小部件,它表现出一些非常奇怪的行为。我可以键入文本,然后按“删除”键删除该文本;但在输入“空格”字符后,“del”键将不再删除该空格字符之前的字符 一个例子讲了一千个单词,所以考虑下面两个非常简单的应用… 示例1:LinearLayout小部件中的Ed

我正在使用androidsdk2.2在eclipsebuildid20090920-1017中开发一个应用程序,并在googlenexusone上进行测试。出于以下测试的目的,我在非根手机上使用输入法“Android键盘”

我有一个EditText小部件,它表现出一些非常奇怪的行为。我可以键入文本,然后按“删除”键删除该文本;但在输入“空格”字符后,“del”键将不再删除该空格字符之前的字符

一个例子讲了一千个单词,所以考虑下面两个非常简单的应用…

示例1:LinearLayout小部件中的EditText:

package com.example.linear.edit;

import android.app.Activity;
import android.os.Bundle;

import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.LinearLayout;

public class LinearEdit extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);        

        LinearLayout layout = new LinearLayout(getApplicationContext());
        layout.setLayoutParams(new Gallery.LayoutParams(Gallery.LayoutParams.MATCH_PARENT, Gallery.LayoutParams.MATCH_PARENT));

        EditText edit = new EditText(getApplicationContext());
        layout.addView(edit, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

        setContentView(layout);
    }
}
package com.example.linear.edit;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.ViewGroup.LayoutParams;
导入android.widget.EditText;
导入android.widget.Gallery;
导入android.widget.LinearLayout;
公共类LinearEdit扩展活动
{
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout布局=新的LinearLayout(getApplicationContext());
layout.setLayoutParams(新建Gallery.LayoutParams(Gallery.LayoutParams.MATCH_父级,Gallery.LayoutParams.MATCH_父级));
EditText edit=新的EditText(getApplicationContext());
layout.addView(编辑,新建LinearLayout.LayoutParams(LayoutParams.MATCH_父项,LayoutParams.WRAP_内容));
setContentView(布局);
}
}

运行上述应用程序,输入文本“编辑示例”,然后按“删除”键数次,直到删除整个句子。一切正常

现在考虑示例2:一个画廊小部件中的编辑文本:

package com.example.gallery.edit;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.LinearLayout;

public class GalleryEdit extends Activity
{
    private final String[] galleryData = {"string1", "string2", "string3"};

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);        

        Gallery gallery = new Gallery(getApplicationContext());

        gallery.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, galleryData)
        {
            @Override
            public View getView(int position, View convertView, ViewGroup parent)
            {
                LinearLayout layout = new LinearLayout(getApplicationContext());
                layout.setLayoutParams(new Gallery.LayoutParams(Gallery.LayoutParams.MATCH_PARENT, Gallery.LayoutParams.MATCH_PARENT));

                EditText edit = new EditText(getApplicationContext());
                layout.addView(edit, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

                return layout;
            }
        });

        setContentView(gallery);
    }
}
package com.example.gallery.edit;
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
导入android.view.ViewGroup;
导入android.view.ViewGroup.LayoutParams;
导入android.widget.ArrayAdapter;
导入android.widget.EditText;
导入android.widget.Gallery;
导入android.widget.LinearLayout;
公共类GalleryEdit扩展活动
{
私有最终字符串[]galleryData={“string1”、“string2”、“string3”};
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Gallery Gallery=新画廊(getApplicationContext());
gallery.setAdapter(新的ArrayAdapter(getApplicationContext(),android.R.layout.simple_列表_项_1,galleryData)
{
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
LinearLayout布局=新的LinearLayout(getApplicationContext());
layout.setLayoutParams(新建Gallery.LayoutParams(Gallery.LayoutParams.MATCH_父级,Gallery.LayoutParams.MATCH_父级));
EditText edit=新的EditText(getApplicationContext());
layout.addView(编辑,新建LinearLayout.LayoutParams(LayoutParams.MATCH_父项,LayoutParams.WRAP_内容));
返回布局;
}
});
setContentView(图库);
}
}

运行上述应用程序,输入文本“编辑示例”,然后按“删除”键数次。如果您遇到与我相同的问题,那么您将发现无法删除超过“空格”字符的内容。一切都不好

如果有人能对这个问题有所了解,我将不胜感激


关于

我最终编写了自己的gallery视图,我只是想为过渡动画线程寻找一个比asynctask更好的实现。至少我的edittext控件现在可以工作了。一旦我把它整理好,我会把一些示例代码贴出来。如果有人对安卓开发者感兴趣,他们的主题是:(该死,我只能发布一次链接)。因此,在“多媒体资料上的编辑文本”中搜索“软键盘”del键失败,另一个链接是:
我也遇到了这个问题。我没有编写自己的库视图,而是覆盖了导致此问题的库视图的行为。它基本上捕获del(和return)关键事件。我的解决方案:

public class PatchedGallery extends Gallery
{
    public PatchedGallery(Context context)
    {
        super(context);
    }

    public PatchedGallery(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public PatchedGallery(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event)
    {
        boolean handled = false;

        if (getFocusedChild() != null)
        {
            handled = getFocusedChild().dispatchKeyEvent(event);
        }

        if (!handled)
        {
            handled = event.dispatch(this, null, null);
        }

        return handled;
    }
}

我希望这能为下一个遇到这个问题的人省去一些麻烦:)

我已经在Android开发者谷歌小组上发布了替换图库视图的示例代码,主题是“带有fling、bounce、animation等的示例图库样式视图”。URL是我面临的同样问题。嗯,看来我们真的需要建立一个自定义的画廊来做这项工作。你知道为什么会这样吗?这应该是Android中的一个bug吗?