setOnKeyListener не демонстрирует такое же поведение на galaxy s2, как на эмуляторе - PullRequest
2 голосов
/ 05 января 2012

Я искал решение этой проблемы без удачи.

У меня есть приложение simpe android, в котором пользователь вводит число в одно поле editText (@ + id / incBox), и определенный процент этого числа автоматически помещается в другой текст editText (@ + id / excBox).

Я реализовал setOnKeyListener для обоих полей editText, который получает введенное число и выполняет вычисления для обновления другого поля (наоборот).

Этот код работает в эмуляторе каждый раз, когда вводится цифра, обновляется другое поле editText. Однако при запуске apk на моем Samsung Galaxy S2 другое поле не обновляется. Чтобы обновить другое поле на телефоне , нажмите клавишу Enter на программной клавиатуре. Что мне здесь не хватает? Я даже удалил event.getAction () == KeyEvent.ACTION_UP «if», чтобы убедиться, что никакие события CANCEL или MULTITOUCH не влияют на слушателя OnKey. Как мне добраться до этого, чтобы работать на телефоне?

Другая проблема, с которой я сталкиваюсь, заключается в том, что после ввода значения в поле. Перемещение в другое поле и удаление или нажатие клавиши ввода довольно запаздывает. Иногда при нажатии кнопки возврата назад происходит задержка в 0,5 секунды, чтобы удалить цифру в уже заполненном поле. Это из-за попытки поймать?

Любая помощь будет оценена.

это main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="top"
    android:background="@drawable/bground"
>

    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/inclusive"
    android:textSize="20px"
    android:paddingTop="10px"
    android:textStyle="bold" />


    <EditText
    android:id="@+id/incBox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" 
    android:layout_gravity="center_horizontal"
    android:layout_marginLeft="25px"
    android:layout_marginRight="25px"
    android:singleLine="true"
    >
    <requestFocus />
    </EditText>


    <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="20px"
    android:textStyle="bold"
    android:gravity="center_horizontal"
    android:text="@string/exclusive" />

    <EditText
    android:id="@+id/excBox"
    android:layout_width="fill_parent"
    android:layout_height="60px"
    android:inputType="numberDecimal" 
    android:layout_gravity="center_horizontal"
    android:layout_marginLeft="25px"
    android:layout_marginRight="25px"
    android:singleLine="true"
    >
    </EditText>
</LinearLayout>

а вот и активность.java

public class PercentageCalculatorActivity extends Activity
{

private EditText inclusive;
private EditText exclusive;
DecimalFormat cost = new DecimalFormat("0.00");

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // Set Activity Layout
    setContentView(R.layout.main);

    // Get the EditText and Button References
    inclusive = (EditText)findViewById(R.id.incBox);
    exclusive = (EditText)findViewById(R.id.excBox);

    //Set KeyListener to ourself
    inclusive.setOnKeyListener(new OnKeyListener() 
    { 
 public boolean onKey(View v, int keyCode, KeyEvent event) 
      { 
        try
        {

         double num = Double.parseDouble( inclusive.getText().toString() );

        if ( num > 0)
        {                           
          num = num * 0.25;
        String exc = cost.format(num).toString();
        exclusive.setText(exc);
            }

    // Close the keyboard on enter press                                    if ( keyCode == 66  )                           {
    InputMethodManager imm = (InputMethodManager)getSystemService    (Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(inclusive.getWindowToken(), 0);
    }

            return false;
            }
            catch (Throwable e)
                {
                // set other field to empty if this field is also blank
    exclusive.setText("");
                        return false;
                }            
        }
    });

   exclusive.setOnKeyListener(new OnKeyListener() 
    { 
        public boolean onKey(View v, int keyCode, KeyEvent event) 
        { 
            if(event.getAction()==KeyEvent.ACTION_UP ) 
            { 
                try
                {
                    double num = Double.parseDouble( exclusive.getText().toString() );

                    if ( num > 0)
                    {
                        num = num * 4;
                        String exc = cost.format(num).toString();
                        inclusive.setText(exc);
                    }

                    if ( keyCode == 66  )
                    {
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(exclusive.getWindowToken(), 0);
                    }                   

            return false;
                }
                catch (Throwable e)
                {
                    // set other field to empty if this field is also blank 
                                inclusive.setText("");
                    return false;
                }

            }
            else
            {
                return false;
            }

        }
    });

1 Ответ

1 голос
/ 05 января 2012

На самом деле это зависит не от устройства, а от выбранной клавиатуры. Я сталкивался с этим раньше. Если вы поменяете клавиатуру на другую, вы обнаружите, что она вдруг начинает реагировать так, как вы ожидаете. Я не уверен, в чем причина этого, но вы должны попробовать и посмотреть, решит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...