Android onfocuschange xml
Android onfocuschange in xml
我有一个 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没有办法?
XML 中没有 属性,就像 onFocusChanged.You 必须在 java 代码本身中处理焦点更改。
传统上它不用于 xml 声明,您可以将 android:focusable
XML 属性添加到视图,在您的布局声明结束时将其设置为真。然后,您必须在 java 代码中处理焦点更改。
没有 android
XML 名称空间等同于您描述的 OnFocusChangeListener
,但理论上您可以使用反射和 Android 数据绑定库实现类似的东西,虽然我可能会避免这种情况 - 只处理 Java.
中的焦点变化要干净得多
我们无法在 xml 文件中的 edittext 上设置焦点更改侦听器,如 onclicklistener。我们只需要在 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();
}
}
});
如果您使用 Android 数据绑定来绑定您的处理程序,那么您可以在代码中的任何位置编写自定义 BindingAdapter 以将您的处理程序从 xml 传递到 java:
@BindingAdapter("app:onFocusChange")
public static void onFocusChange(EditText text, final View.OnFocusChangeListener listener) {
text.setOnFocusChangeListener(listener);
}
然后在 Handler.java 中写一个 getter 那 returns 一个匿名的 class:
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>
我有一个 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没有办法?
XML 中没有 属性,就像 onFocusChanged.You 必须在 java 代码本身中处理焦点更改。
传统上它不用于 xml 声明,您可以将 android:focusable
XML 属性添加到视图,在您的布局声明结束时将其设置为真。然后,您必须在 java 代码中处理焦点更改。
没有 android
XML 名称空间等同于您描述的 OnFocusChangeListener
,但理论上您可以使用反射和 Android 数据绑定库实现类似的东西,虽然我可能会避免这种情况 - 只处理 Java.
我们无法在 xml 文件中的 edittext 上设置焦点更改侦听器,如 onclicklistener。我们只需要在 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();
}
}
});
如果您使用 Android 数据绑定来绑定您的处理程序,那么您可以在代码中的任何位置编写自定义 BindingAdapter 以将您的处理程序从 xml 传递到 java:
@BindingAdapter("app:onFocusChange")
public static void onFocusChange(EditText text, final View.OnFocusChangeListener listener) {
text.setOnFocusChangeListener(listener);
}
然后在 Handler.java 中写一个 getter 那 returns 一个匿名的 class:
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>