2013-09-10 3 views
2

Я генерирую несколько EditText в цикле и хочу обновить «оценку», когда фокус потерян с одного из EditText. Я также хочу проверить, что вход действителен, а если нет, пуст EditText и снова установите фокус.Множественные (динамические) задачи EditText и onFocusChange

В следующем коде добавлены EditTexts и onFocusChangeListener.

Проблема в том, что когда оценка недействительна (updateScore(id) возвращает false), я хочу удалить EditText и установить фокус на этот вид.

Проблема в моем коде, что если я ввести значение в EditText, которые не являются действительными, а затем нажмите на EditTextB. Оба иB иметь фокус ... Я только хочу А иметь фокус ...

Как я могу вернуть фокус на предыдущую EditText и быть готовыми к новому вкладу в эту точке зрения?

for (int player = 0; player < numPlayers; player++) 
    { 
     EditText valueET = new EditText(this); 

     valueET.setOnClickListener(new OnClickListener() {   
     @Override public void onClick(View v) { 
       Log.v("Focus", "Lagrer unna den som har blitt klikket, " + String.valueOf(v.getId())); 
       etHasFocus = (EditText) v; 
      } 
     }); 

     valueET.setOnFocusChangeListener(new OnFocusChangeListener() {   
      public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus) 
      { 
       if(!updateScore(v.getId())) 
       { 
       if (etHasFocus != null && v.getId() != etHasFocus.getId()) 
        etHasFocus.clearFocus();    

        v.requestFocus(); 
      } 
      }); 

     valueET.setId(200+player*100+row); 
     valueET.setInputType(InputType.TYPE_CLASS_NUMBER); 
     valueET.setTextColor(Color.BLACK); 
     valueET.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

     tr.addView(valueET); 
    } 
tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

Код для updateScore (ID) есть (упрощенно):

boolean updateScore(int id) 
{ 
    EditText t = (EditText) findViewById(id); 
    String text = t.getText().toString(); 
    if(!text.equals("")) 
    { 
     int score = Integer.parseInt(text); 
    } 
    if(score != 9) 
     return false; 

     TextView total = (TextView) findViewById(ID_toal); 
     t2.setText(String.valueOf(score)); 
     return true; 
} 

код обновляется, проблема сейчас в том, что OnClick никогда не называется ... (Так etHasFocus = нуль)

ответ

1

Вы можете попытаться сохранить трек, на который были нажаты EditText. Для этого создайте переменную EditText:

EditText etHasFocus; 

В дополнение к добавлению OnFocusChangeListener, добавьте OnClickListener, а также:

valueET.setOnClickListener(new OnClickListener() {   

    @Override 
    public void onClick(View v) { 
     etHasFocus = (EditText) v; 
    } 
}); 

Теперь внутри вашего OnFocusChangeListener, внести следующие изменения:

valueET.setOnFocusChangeListener(new OnFocusChangeListener() {   

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) { 

      if(!updateScore(v.getId())) { 

       // Clear focus from another EditText 
       if (etHasFocus != null && v.getId() != etHasFocus.getId()) { 
        etHasFocus.clearFocus();      
       } 

       v.requestFocus(); 
      } 
     } 
    } 
}); 

Редактировать:

Вы правы. метод onClick(View) вызывается вторым кликом. Я могу предложить вам альтернативный подход. Я попробовал это, и его работает отлично:

Создать переменную EditText:

EditText etCurrent; 

Установить OnTouchlistener на каждом EditText:

valueET.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 

      if (etCurrent != null) { 
       if (etCurrent.getId() != v.getId()) { 

        if (!check(etCurrent.getId())) { 
         etCurrent.setSelection(0, 
           etCurrent.getText().toString().length()); 
         return true; 
        } else { 
         etCurrent = (EditText) v; 
        } 
       } 
      } else { 
       etCurrent = (EditText) v; 
      } 
     } 

     return false; 
    } 
}); 

Удалить OnClickListener, onFocusChangeListener и etHasFocus.

Вам не нужно инициализировать etCurrent, так как if (etCurrent != null) { } else { } позаботится об этом.

+0

Можно ли использовать OnclickListener с EditText? Я добавил его, но он никогда не называется ... – EirikO

+0

Это очень возможно: [Ссылка] (http://developer.android.com/reference/android/view/View.html#setOnClickListener (android.view.View.OnClickListener)). Можете ли вы опубликовать обновленный код? – Vikram

+0

Хорошо, код в настоящее время обновлен .. – EirikO

Смежные вопросы