从 xml 移除 onClick 属性
Remove onClick Attribute from xml
我在 xml 中有一个带有 onClick 属性的图像视图,如下所示:
android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}"
我还有一个以编程方式定义的 onClick。在某些特殊情况下,我希望片段中定义的 onClick 起作用,所以我想删除 xml.
中的 onClick
换句话说,有时我想用片段中的点击侦听器覆盖 xml 中的 onclick。我该怎么做?
从 xml 中删除 onClick
并为 onCreate()
或 onCreateView()
中的视图设置 ClickListener
如果它是 Fragment
.
例如
View v = findViewById(R.id.theViewId); // cast it if necessary
v.setOnClickListener(); // set it here with the code
试试这个:
ImageView i = (ImageView) findViewById(R.id.ImageViewId);
i.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...your on click code here...
}
});
这将删除点击侦听器,即使它是 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!此外,根据它是否是有状态操作,您可能希望将侦听器设置为最终实例对象,以避免不必要地重新创建实例。
在你的 xml 文件中加入一些条件,这里我给你一个在 xml
中使用布尔变量的示例
android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"
这里variable
是一个boolean变量,你可以引用自己的变量。
viewModel.onOtherClick
是ViewModel
中可用的方法,您可以参考ViewModel
或Interface
中自己的方法
如果您想在某些情况下删除 clicklistener,只需将 null
替换为 viewModel.onOtherClick
我在 xml 中有一个带有 onClick 属性的图像视图,如下所示:
android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}"
我还有一个以编程方式定义的 onClick。在某些特殊情况下,我希望片段中定义的 onClick 起作用,所以我想删除 xml.
中的 onClick换句话说,有时我想用片段中的点击侦听器覆盖 xml 中的 onclick。我该怎么做?
从 xml 中删除 onClick
并为 onCreate()
或 onCreateView()
中的视图设置 ClickListener
如果它是 Fragment
.
例如
View v = findViewById(R.id.theViewId); // cast it if necessary
v.setOnClickListener(); // set it here with the code
试试这个:
ImageView i = (ImageView) findViewById(R.id.ImageViewId);
i.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...your on click code here...
}
});
这将删除点击侦听器,即使它是 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!此外,根据它是否是有状态操作,您可能希望将侦听器设置为最终实例对象,以避免不必要地重新创建实例。
在你的 xml 文件中加入一些条件,这里我给你一个在 xml
中使用布尔变量的示例android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"
这里variable
是一个boolean变量,你可以引用自己的变量。
viewModel.onOtherClick
是ViewModel
中可用的方法,您可以参考ViewModel
或Interface
如果您想在某些情况下删除 clicklistener,只需将 null
替换为 viewModel.onOtherClick