xml中的Android onfocuschange

时间:2016-06-13 11:09:07

标签: android xml android-layout focus

我有一个Android应用程序,在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) { ...}

或者在xml中无法进行onFocusChange?

5 个答案:

答案 0 :(得分:11)

如果您使用Android数据绑定来绑定处理程序,那么您可以在代码中的任何位置编写自定义BindingAdapter,以将处理程序从xml传递到java:

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

在Handler.java中编写一个返回匿名类的getter:

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>

答案 1 :(得分:2)

我们无法在xml文件中设置editext的焦点更改侦听器,如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();
    }
   }
});

答案 2 :(得分:0)

在onFocusChanged中没有像XML这样的属性。你必须处理java代码本身的焦点变化。

答案 3 :(得分:0)

传统上它没有在xml声明中使用,你可以将android:focusable XML属性添加到View中,在你的布局声明中设置为true。然后你必须处理java代码中的焦点变化。

答案 4 :(得分:0)

您所描述的android没有OnFocusChangeListener XML命名空间等效,但理论上您可以使用Reflection和Android数据绑定库实现类似的东西,尽管我可能会避免这种情况 - 它是更简洁,只需处理Java中的焦点变化。