我在xml中有一个带有onClick属性的图像视图,如下所示:
android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}"
我还以编程方式定义了onClick。在某些特殊情况下,我希望片段中定义的onClick能够工作,所以我想删除xml中的onClick。
换句话说,有时候,我想用片段中的点击监听器覆盖xml中的onclick。我怎么能这样做?
答案 0 :(得分:2)
在你的xml文件中放一些条件,这里我给你一个在xml中使用boolean变量的样本
android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"
这里variable
是一个布尔变量,你可以参考你自己的变量。
viewModel.onOtherClick
是ViewModel
中提供的方法,您可以从ViewModel
或Interface
如果您想在某些情况下删除clicklistener,只需将null
代替viewModel.onOtherClick
答案 1 :(得分:0)
这将删除单击侦听器,即使它是xml属性:
imageView.setOnClickListener(null);
除非你使用反射,否则你无法在设置之后获得监听器,这是非常低性能和糟糕的代码风格。
我个人这样做的方法是在这种情况下不使用XML属性。相反,为您的图像将要处于的2个状态创建一个枚举:
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!此外,根据它是否是有状态操作,您可能希望使侦听器成为最终实例对象,以避免不必要地重新创建实例。
答案 2 :(得分:-1)
从xml中移除onClick
,并为ClickListener
或onCreate()
中的视图设置onCreateView()
,如果它是Fragment
。
e.g。
View v = findViewById(R.id.theViewId); // cast it if necessary
v.setOnClickListener(); // set it here with the code
答案 3 :(得分:-1)
试试这个:
ImageView i = (ImageView) findViewById(R.id.ImageViewId);
i.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...your on click code here...
}
});