2013-06-27 5 views
20

У меня есть номер EditText s на моей странице вместе с двумя кнопками. Я хочу, чтобы пользователь коснулся любого поля EditText и нажал любую кнопку, чтобы вставить определенное значение в то самое поле , которое он коснулся. Предоставление ввода с клавиатуры невозможно. Пожалуйста, помогите мне сделать это.Как я могу обнаружить сфокусированный EditText в android?

+1

может быть, вы ищете View.setOnTouchListener – mihail

+0

я на самом деле хочу, чтобы обнаружить целенаправленный вид EditText. –

ответ

10

Одна вещь, которую вы можете сделать, это объявить глобальную переменную evalue, которая покажет вам, что является last selected EditText с помощью onTouchListener, а затем на основе значения evalue, вы можете установить значение текста в EditText по нажатию кнопки. надеюсь, вы поняли.

код для него может быть следующим:

EditText e1,e2; 
    Button b1,b2; 
    String evalue; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     e1=(EditText)findViewById(R.id.editText1); 
     e2=(EditText)findViewById(R.id.editText2); 
     b1=(Button)findViewById(R.id.button1); 
     b2=(Button)findViewById(R.id.button2); 

     e1.setOnTouchListener(new View.OnTouchListener() 
     { 
      public boolean onTouch(View arg0, MotionEvent arg1) 
      { 
       evalue="1"; 
       return false; 
      } 
     }); 

     e2.setOnTouchListener(new View.OnTouchListener() 
     { 
      public boolean onTouch(View arg0, MotionEvent arg1) 
      { 
       evalue="2"; 
       return false; 
      } 
     }); 
     b1.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       if(evalue=="1") 
       { 
        e1.setText("yes"); 
       } 
       if(evalue=="2") 
       { 
        e2.setText("yes"); 
       } 
      } 
     }); 


     b2.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       if(evalue=="1") 
       { 
        e1.setText("No"); 
       } 
       if(evalue=="2") 
       { 
        e2.setText("No"); 
       } 
      } 
     }); 

    } 

Его логическое кодирование .. не ДО знака .. если вы найдете лучше. затем используйте его. Спасибо.

+0

Большое спасибо. Это полностью выполнило мое требование. –

+2

Я думаю, вы прибили его. Есть так много других ответов, которые предполагают, что onFocusChange является обязательным событием слушателя. Я думаю, что они делают это, потому что они думают с точки зрения ПК/браузера. Это выглядит правильно. Сенсорные устройства не работают так. Проблема в том, что когда я тестирую эти другие ответы, курсор все еще «мигает» в поле после того, как я касаюсь кнопки. Таким образом, это означает, что фокус все еще находится в полевых условиях, несмотря на обращение к другому элементу интерфейса на экране. Поэтому вы должны обнаружить, что еще было затронуто, а не поле в фокусе.+1 – giulio

+0

// Событие onFocusChange будет работать при перемещении между редактируемыми полями. Трюк пытается понять контекст поведения на сенсорных устройствах с виртуальными клавиатурами. – giulio

40

Вы можете использовать View.OnFocusChangeListener, чтобы определить, получил ли какой-либо вид (edittext) или потерял фокус.

for (EditText view : editList){ 
    view.setOnFocusChangeListener(focusListener); 
} 
.... 
private OnFocusChangeListener focusListener = new OnFocusChangeListener() { 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus){ 
      focusedView = v; 
     } else { 
      focusedView = null; 
     } 
    } 
} 

Это относится к вашей деятельности или фрагменту или в любом месте, где есть EditTexts. .... просто говорит, что вы можете поместить его в другое место в классе. И, очевидно, вам нужно будет создать массив с ними в нем, таким образом, editList.

+0

у вас пробовал этот код? если один из входов потерял фокус, а другой получил его, то слушатель будет вызываться дважды. может ли focusView быть null после этого? –

5

иметь свой FragmentOnTouchListener реализовать & OnFocusChangeListener:

public class AttributesFragment extends Fragment 
         implements OnTouchListener, OnFocusChangeListener { 

Затем осуществить с помощью:

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    if (view instanceof EditText) { 
     view.setOnFocusChangeListener(this); // User touched edittext 
    } 
    return false; 
} 

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

} 

Не забудьте настроить слушателя после создания EditText

editText.setOnTouchListener(this); 

Таким образом, если поле EditText сфокусировано по умолчанию, но пользователь не изменил поле, он не будет запускать событие onFocusChange.

18

Это работает для меня. Он возвращает логическое значение.

myEditText.hasFocus() 
2

Это работает для меня.

e1 = (EditText) findViewById(R.id.editText1); 

e1.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View arg0, boolean hasfocus) { 
     if (hasfocus) { 
     Log.e("TAG", "e1 focused") 
     } else { 
     Log.e("TAG", "e1 not focused") 
     }    
    } 
});