2016-06-13 3 views
4

У меня есть приложение для Android, и в файле макета XML У меня есть что-то вроде этого:Android onfocuschange в XML

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/checkBoxDone" 
    android:checked="false" 
    android:clickable="true" 
    android:onClick="doneCheckBoxClicked" /> 

Тогда в Java коде я реализовал

public void doneCheckBoxClicked(View v) { ...} 

Могу ли я использовать аналогичный подход к действиям по смене фокуса. Есть в XML-то вроде

android:onFocusChanged="editTextFieldFocusChanged" 

, а затем в Java-код:

public void editTextFieldFocusChanged(View v, boolean hasFocus) { ...} 

Или нет никакого способа сделать onFocusChange в XML?

ответ

2

Мы не можем установить прослушиватель смены цвета editext в xml-файл, например, onclick listener. Нам нужно сделать это только в файле Java.

edit_Text.setOnFocusChangeListener(new OnFocusChangeListener() { 
@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if(hasFocus){ 
     Toast.makeText(getApplicationContext(), "got the focus", Toast.LENGTH_LONG).show(); 
    }else { 
     Toast.makeText(getApplicationContext(), "lost the focus", Toast.LENGTH_LONG).show(); 
    } 
    } 
}); 
+0

Спасибо! Жаль, однако. Было бы очень удобно :) – Jeni

+0

@Jeni Спасибо, что приняли ответ –

0

В XML не найдено объектов, таких как onFocusChanged.You нужно обрабатывать изменение фокуса в самом Java-коде.

0

Традиционно он не используется в объявлении xml, вы можете добавить атрибут android:focusable XML в представление, в конце объявления вашего макета установите его true. Затем вам нужно обработать изменение фокуса в вашем Java-коде.

0

Существует эквивалент пространства имен для OnFocusChangeListener пространства , как вы описали, но теоретически вы могли бы реализовать что-то подобное с помощью Reflection и библиотеки привязки данных Android, хотя я бы, вероятно, избежал этого: намного проще обрабатывать фокус изменение в Java.

4

Если вы используете Android привязки данных для привязки обработчиков, то вы можете написать собственный BindingAdapter в любом месте вашего кода, чтобы передать свой обработчик из XML в Java:

@BindingAdapter("app:onFocusChange") 
public static void onFocusChange(EditText text, final View.OnFocusChangeListener listener) { 
    text.setOnFocusChangeListener(listener); 
} 

И в Handler.java написать поглотитель, который возвращает анонимный класс:

public class Handler { 
    public View.OnFocusChangeListener getOnFocusChangeListener() { 
     return new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View view, boolean isFocussed) { 
       System.out.print("S"); 
      } 
     }; 
    } 
} 

Теперь в вашем XML вы можете передать в обработчик, как это:

<layout xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="handler" type="Handler" /> 
    </data> 
    <EditText app:onFocusChange="@{handler.OnFocusChangeListener}"/> 
</layout> 
Смежные вопросы