安卓数据绑定中的自定义XML属性

3

我在我的片段中使用了AppCompatSpinner,并且想要在我的布局中使用setOnItemSelectedListener()。我尝试使用这里的教程部分。

https://developer.android.com/topic/libraries/data-binding/index.html?hl=en#custom_setters

但它没有提供一个完整的例子来执行简单的操作。我也在这里寻找答案: 在自定义控件中使用Android数据绑定 我仍然不明白如何做到这一点。我想要一个完整的例子,来执行简单的自定义绑定,并且带有一些在xml属性中不存在但在UI控件中非常有用的属性。
这是我的xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:apps="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
    >

    <data>

        <import type="android.view.View"/>

        <variable
            name="handler"
            type="com.my.OldHandlerInterface"/>
    </data>

    <merge
        tools:showIn="@layout/fragment_stock_replacement">


        <android.support.v7.widget.CardView
            android:id="@+id/exist_eqpt_card"
            style="@style/sccardview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.29"
            android:visibility="@{oldObj.updateOld_mode ? View.VISIBLE : View.GONE}"
            >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="10dp"
                android:orientation="vertical">

                <android.support.v7.widget.AppCompatSpinner
                    android:id="@+id/spn_status"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_below="@+id/chk_installed"
                    apps:adapter="@{statusAdapter}"/>
            </RelativeLayout>

        </android.support.v7.widget.CardView>
        <!--</LinearLayout>-->

    </merge>
</layout>

这是我的片段

public class ReplacementFragment extends QRScanFragment {
    ../
    @BindingAdapter("app:setOnItemSelectedListener")
    public static void setOnItemSelectedListener(AppCompatSpinner view, int pos) {
        //do sth
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater, R.layout.binding, container, false);
        String[] status = new String[]{"Spare", "Lost", "Damage", "Faulty"};
        statusAdapter = new StatusAdapter(getActivity(), status);
        binding.setHandler(new Handler());
        View view = binding.getRoot();
        AppCompatSpinner lAppCompatSpinner = (AppCompatSpinner) view.findViewById(R.id.spn_status);
        lAppCompatSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
         @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            }
        }
    }
}
1个回答

11

您不需要任何特殊的内容来分配给 OnItemSelectedListener:

<android.support.v7.widget.AppCompatSpinner
    android:id="@+id/spn_status"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/chk_installed"
    android:onItemSelectedListener="@{myItemSelectedListener}"
    apps:adapter="@{statusAdapter}"/>
上述假设在您的布局中有一个类型为OnItemSelectedListener的myItemSelectedListener变量。
如果您只想使用onItemSelected或onNothingSelected,则可以在您的布局中已经使用该属性:
<android.support.v7.widget.AppCompatSpinner
    android:id="@+id/spn_status"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/chk_installed"
    android:onItemSelected="@{handler::onItemSelected}"
    apps:adapter="@{statusAdapter}"/>

这假设在 handler 所属的类中有一个方法:

public class Handler {
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        //...
    }
}

你也可以使用lambda表达式:

android:onItemSelected="@{(p, v, pos, id) -> handler.onItemSelected(v, pos)}"

在这里,处理程序的类有一个方法:

public class Handler {
    public void onItemSelected(View view, int position) {
        //...
    }
}
在所有这些情况下,您必须在 onCreateView 中分配处理程序或监听器,就像您在上面使用 binding.setHandler(...) 调用一样。您不需要调用 lAppCompatSpinner.setOnItemSelectedListener(...),因为它将作为绑定的一部分完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接