从xml中删除onClick Atribute

时间:2017-05-09 09:55:48

标签: java android xml override android-databinding

我在xml中有一个带有onClick属性的图像视图,如下所示:

android:onClick="@{(view)->globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle())}"

我还以编程方式定义了onClick。在某些特殊情况下,我希望片段中定义的onClick能够工作,所以我想删除xml中的onClick。

换句话说,有时候,我想用片段中的点击监听器覆盖xml中的onclick。我怎么能这样做?

4 个答案:

答案 0 :(得分:2)

在你的xml文件中放一些条件,这里我给你一个在xml中使用boolean变量的样本

android:onClick="@{(view)-> variable ? globalBinding.onItemClicked(view,trackingViewModel.getSearchStyle()) : viewModel.onOtherClick(view)}"

这里variable是一个布尔变量,你可以参考你自己的变量。

viewModel.onOtherClickViewModel中提供的方法,您可以从ViewModelInterface

参考您自己的方法

如果您想在某些情况下删除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,并为ClickListeneronCreate()中的视图设置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...
        }
    });