Pan*_*kaj 44 data-binding android android-databinding android-6.0-marshmallow
我正在尝试使用Android M附带的DataBinding Library将事件与xml中的视图绑定.我正在关注Android开发人员的示例并逐步实现.对于视图的属性,如可见性,文本工作正常,但如果我尝试与onclick绑定,它不会按预期工作.这是我到目前为止尝试过的示例代码:
<data>
<import type="android.view.View"/>
<variable name="user" type="com.example.databinding.User"/>
<variable name="handlers" type="com.example.databinding.MyHandlers"/>
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:id="@+id/button"
android:layout_gravity="left"
android:onClick="@{handlers.onClickFriend}"/>
Run Code Online (Sandbox Code Playgroud)
主要活动 :
public class MainActivity extends AppCompatActivity {
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding =
DataBindingUtil.setContentView(this,R.layout.activity_main);
user = new User("Pankaj","Kumar",true,true);
binding.setUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
MyHandlers:
public class MyHandlers {
public void onClickFriend(View view){
Log.i(MyHandlers.class.getSimpleName(),"Now Friend");
}
public void onClickEnemy(View view){
Log.i(MyHandlers.class.getSimpleName(),"Now Enemy");
}
}
Run Code Online (Sandbox Code Playgroud)
我只编写了必需的代码来提高可读性.有人可以帮我这个.
Min*_*tdh 96
我想你也需要绑定它handlers,也许是这样的onCreate:
MyHandlers handlers = new MyHandlers();
binding.setHandlers(handlers);
Run Code Online (Sandbox Code Playgroud)
Khe*_*raj 27
1)将处理程序传递给绑定。
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
Hander handler = new Handler();
binding.setHandlers(handlers);
Run Code Online (Sandbox Code Playgroud)
2)设置点击次数(使用以下任一选项)
android:onClick="@{handler::onClickMethodReference}"
Run Code Online (Sandbox Code Playgroud)
要么
android:onClick="@{handler.onClickMethodReference}"
Run Code Online (Sandbox Code Playgroud)
要么
android:onClick="@{() -> handler.onClickLamda()}"
Run Code Online (Sandbox Code Playgroud)
要么
android:onClick="@{(v) -> handler.onClickLamdaWithView(v)}"
Run Code Online (Sandbox Code Playgroud)
要么
android:onClick="@{() -> handler.onClickLamdaWithView(model)}"
Run Code Online (Sandbox Code Playgroud)
请参阅Handler类以进行了解。
public class Handler {
public void onClickMethodReference(View view) {
//
}
public void onClickLamda() {
//
}
public void onClickLamdaWithView(View view) {
//
}
public void onClickLamdaWithObject(Model model) {
//
}
}
Run Code Online (Sandbox Code Playgroud)
注意
onClickLamdaWithObject示例一样传递任何对象。View对象,则只需使用(v)->表达式。进一步阅读
https://developer.android.com/topic/libraries/data-binding/expressions
wal*_*kmn 14
在xml中使用以下格式:
android:onClick="@{handlers::onClickFriend}"
Run Code Online (Sandbox Code Playgroud)
注意::,不要担心xml编辑器中的红线,因为目前这是Android Studio xml编辑器的开放bug.
当handlers从数据标签的变量:
<data>
<variable name="handlers" type="com.example.databinding.MyHandlers"/>
</data>
Run Code Online (Sandbox Code Playgroud)
并且onClickFriend是你的方法:
public class MyHandlers {
public void onClickFriend(View view) {
Log.i(MyHandlers.class.getSimpleName(),"Now Friend");
}
}
Run Code Online (Sandbox Code Playgroud)
添加
对于onLongClickxml中的句柄添加:
android:onLongClick="@{handlers::onLongClickFriend}"
Run Code Online (Sandbox Code Playgroud)
并onLongClickFriend在ViewModel类中添加方法:
public class MyHandlers {
public boolean onLongClickFriend(View view) {
Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
添加
如果您需要显示敬酒消息,你可以使用接口(更好的方法),或通过context在MyHandlers建筑类:
public class MyHandlers {
private Context context;
public MyHandlers(Context context) {
this.context = context;
}
public boolean onLongClickFriend(View view) {
Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show();
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44619 次 |
| 最近记录: |