从 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.onOtherClickViewModel中可用的方法,您可以参考ViewModelInterface

中自己的方法

如果您想在某些情况下删除 clicklistener,只需将 null 替换为 viewModel.onOtherClick