Клавиша del на программной клавиатуре не работает в EditText в виджете «Галерея»

Я разрабатываю приложение в Eclipse с идентификатором сборки 20090920-1017, используя Android SDK 2.2 и тестируя Google Nexus One. Для целей приведенных ниже тестов я использую IME «Клавиатура Android» на нерутированном телефоне.

У меня есть виджет EditText, который ведет себя очень странно. Я могу ввести текст, а затем нажать клавишу «del», чтобы удалить этот текст; но после того, как я ввожу символ «пробел», клавиша «del» больше не будет удалять символы перед этим символом пробела.

Пример говорит тысячу слов, так что рассмотрите следующие два невероятно простых приложения...

Пример 1: EditText в виджете LinearLayout:

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);
    }
}

Запустите указанное выше приложение, введите текст «редактировать пример», затем несколько раз нажмите клавишу «del», пока не будет удалено все предложение. Все работает нормально.

Теперь рассмотрим пример 2: EditText в виджете галереи:

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);
    }
}

Запустите указанное выше приложение, введите текст «edit example», затем несколько раз нажмите клавишу «del». Если у вас возникла та же проблема, что и у меня, вы обнаружите, что не можете удалить дальше символ «пробел». Все не так хорошо.

Если кто-то может пролить свет на этот вопрос, я был бы очень признателен.

С уважением


person droidful    schedule 04.06.2010    source источник


Ответы (2)


Я также столкнулся с этой проблемой. Вместо того, чтобы писать собственное представление галереи, я переопределяю поведение представления галереи, которое вызывает это. Он в основном перехватывает ключевые события 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;
    }
}

Я надеюсь, что это избавит от головной боли следующего человека, столкнувшегося с этой проблемой :)

person KRASH    schedule 09.08.2011

В итоге я написал свой собственный вид галереи, я просто пытался найти лучшую реализацию, чем асинхронная задача для потоков анимации перехода. По крайней мере, мои элементы управления edittext теперь работают. Я опубликую пример кода, как только разберусь с ним. Если кому-то интересно, темы для разработчиков Android: (Черт возьми, я могу опубликовать ссылку только один раз). Поэтому выполните поиск «Клавиша «del» на программной клавиатуре не работает в EditText в галерее», а другая ссылка: Какой метод лучше всего подходит для рабочего потока анимации?

person droidful    schedule 13.06.2010
comment
Я разместил пример кода для замены представления галереи в группе Android Developers Google Group в разделе Пример представления стиля галереи с переходом, отказом, анимацией и т. д. URL-адрес: groups.google.com/group/android-developers/t/c45bbf070a58303b - person droidful; 14.06.2010
comment
Я столкнулся с той же проблемой. Что ж, похоже, нам действительно нужно создать собственную галерею, чтобы выполнить эту работу. Вы выяснили, почему это происходит? Должна ли это быть ошибка в Android? - person xandy; 11.02.2011