Java 从xml中删除onClick属性
我有一个xml中带有onClick属性的图像视图,如下所示:Java 从xml中删除onClick属性,java,android,xml,overriding,android-databinding,Java,Android,Xml,Overriding,Android Databinding,我有一个xml中带有onClick属性的图像视图,如下所示: android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}" 我还有一个按程序定义的onClick。在某些特殊情况下,我希望片段中定义的onClick能够工作,因此我希望删除xml中的onClick 换句话说,有时,我想用click listener In fragment覆盖xml中的oncl
android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}"
我还有一个按程序定义的onClick。在某些特殊情况下,我希望片段中定义的onClick能够工作,因此我希望删除xml中的onClick
换句话说,有时,我想用click listener In fragment覆盖xml中的onclick。如何操作?从xml中删除
onClick
,并在onCreate()
或onCreateView()
中为视图设置ClickListener
,如果它是片段
e、 g
试试这个:
ImageView i = (ImageView) findViewById(R.id.ImageViewId);
i.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...your on click code here...
}
});
这将删除click listener,即使它是xml属性:
imageView.setOnClickListener(null);
在设置侦听器之后,您无法获取它,除非您使用反射,这会降低性能,而且代码风格也很糟糕
我个人的做法是在这种情况下不使用XML属性。相反,请为图像将处于的两种状态创建枚举:
public enum StateHolder {
FIRST_STATE,
SECOND_STATE;
OnClickListener getListener(StateHolder state) {
switch (state) {
case FIRST_STATE: return view -> //return listener for whatever happens by default here;
case SECOND_STATE: return view -> // whatever happens in the second state here;
default: throw new IllegalStateException(); // do whatever here
}
}
void swapListeners(View view) {
StateHolder current = (StateHolder) view.getTag();
view.setOnClickListener(getListener(current));
view.setTag(current == FIRST_STATE ? SECOND_STATE : FIRST_STATE);
}
}
只需确保在首次创建视图时设置标记,以避免出现NullPointerException!另外,根据它是否是有状态操作,您可能希望使侦听器成为最终实例对象,以避免不必要地重新创建实例。在xml文件中添加一些条件,这里我给您一个在xml中使用布尔变量的示例
android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"
这里的变量
是一个布尔变量,您可以引用自己的变量
viewModel.on其他单击
是viewModel
中可用的方法,您可以从viewModel
或界面
如果您想在某些情况下删除clicklistener,只需将null
替换为viewModel。在另一个单击中,在片段视图中获取ImageView的id,并实现setOnClickListener()@whenthemorningcome我这样做了,但由于xml中存在onClick,片段中的单击侦听器不工作。请从XML中删除onClick,然后将其删除。您正在使用上述方法完成工作。@DKIT我无法删除onClick,我需要它正常工作,在某些情况下,我需要覆盖它。我无法从xml中删除onClick。有没有办法覆盖onClick?@free\u风格你试过了吗?通常setOnClickListener
应该覆盖它。@free\u样式如果不能修改xml,那么我看不到任何其他方法。因为xml中有onClick,所以这不起作用。我尝试了imageView.setOnClickListener(null)代码>xml中的单击侦听器仍在使用单击。我所问的是不可能的吗?(同时使用两个click侦听器?@free_风格被授予,我没有使用或看到您使用的绑定语法,所以我不知道您的具体情况。无论如何,不,我不认为有任何其他方法可以通过编程方式创建这两个实例。这是因为似乎没有办法恢复侦听器的第一个实例并重新使用它(反射除外)。枚举将使它非常轻松,或者让一个侦听器检查一个条件。我将如何控制调用哪个方法?我的意思是如何更改variable
的值。您需要在xml中的
标记内获取变量,并且从java中可以将其作为绑定访问。setVariable()
,例如。如果您的变量名为活动,则可以作为绑定访问它。setActive()
我可以使用它来调用片段中的方法吗?是的,为什么不呢?请看一下基本的数据绑定
示例,您将获得所有信息
android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"