Программная клавиатура "del" не работает в EditText на виджете Галерея - PullRequest
3 голосов
/ 04 июня 2010

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

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

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

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

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

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

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

<code>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» несколько раз. Если вы столкнулись с той же проблемой, что и я, вы обнаружите, что не можете удалить после символа «пробел». Не все хорошо.

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

Привет

Ответы [ 2 ]

8 голосов
/ 09 августа 2011

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

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

0 голосов
/ 13 июня 2010

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

...