我有一个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?
答案 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中的焦点变化。