Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从xml中删除onClick属性_Java_Android_Xml_Overriding_Android Databinding - Fatal编程技术网

Java 从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

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

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)}"