【问题标题】:How to link a click handler to a fragment for data binding?如何将点击处理程序链接到片段以进行数据绑定?
【发布时间】:2020-04-19 01:55:28
【问题描述】:

我想在片段中使用数据绑定来触发处理程序类中的所有按钮点击。当我运行下面的代码时,出现以下错误。

D:\Coding\updatedGithub\AndroidHiveDataBindingFragments\app\build\generated\ap_generated_sources\debug\out\com\example\androidhivedatabindingfragments\DataBinderMapperImpl.java:10: error: cannot find symbol
import com.example.androidhivedatabindingfragments.databinding.FragmentUserBindingImpl;
                                                              ^
  symbol:   class FragmentUserBindingImpl
  location: package com.example.androidhivedatabindingfragments.databinding

我不确定问题是否在于我如何将上下文传递给 Handler 类,或者我是否在数据绑定方面做错了一些事情。

用户片段

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        FragmentUserBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_user, container, false);
        View view = binding.getRoot();

        User user = new User();
        user.setName("First Last");
        user.setEmail("email@email.com");

        binding.setUser(user);

        MyClickHandlers handlers = new MyClickHandlers(getActivity());
        binding.setHandlers(handlers);


        return view;
    }

MyClickHandlers

public class MyClickHandlers {
    private static final String TAG = "MyClickHandlers";

    Context context;

    public MyClickHandlers(Context context) {
        this.context = context;
    }

    public void myClick() {
        Log.d(TAG, "myClick: ");
    }
}

fragment_user

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:bind="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="user"
            type="com.example.androidhivedatabindingfragments.User" />
        <variable
            name="handlers"
            type="com.example.androidhivedatabindingfragments.MyClickHandlers" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".UserFragment"
        android:orientation="vertical">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Click ME"
            android:id="@+id/btn_Click"
            android:onClick="@{handlers::myClick}"/>

        <include android:id="@+id/content"
        layout="@layout/content_main"
        bind:user="@{user}" />

    </LinearLayout>
</layout>

【问题讨论】:

标签: java android android-fragments android-databinding


【解决方案1】:

MyHandlers 中的 onClick() 必须将您单击的视图作为参数,因此将其更改为:

public void myClick(View view) {
    Log.d(TAG, "myClick: ");
}

我想这会解决问题,也请使用上下文而不是活动来实例化MyClickHandlers,因为两者是不同的东西。

所以在onCreateView() 中,添加requireContext() 而不是getActivity()

MyClickHandlers handlers = new MyClickHandlers(requireContext()); 

【讨论】:

  • 我昨晚很晚才做了这两个调整,它开始起作用了,你知道在参数中有 View 的目的吗?
  • @Shawn 通常在绑定xml属性以编程方式访问时,需要提供View本身作为回调参数;这种方式允许生成的数据绑定类 (FragmentUserBindingImpl) 将 java 回调方法与该特定视图的 XML 属性绑定;同样,如果您查看绑定适配器,它们必须至少有一个参数,即视图,您可以根据需要添加更多参数。 This可能对你有帮助
  • 您可以通过导航FragmentUserBindingImpl class 来检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多