android数据绑定

时间:2016-08-25 04:28:49

标签: android data-binding

我已经使用AppCompatSpinner作为我的片段,我想在我的布局中使用setOnItemSelectedListener()。我试着使用这里的教程部分

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

但它没有提供完成简单操作的完整示例。我也从这里寻找答案

android databinding in custom controls

我仍然不明白该怎么做。 我想有一个完整的示例,使用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 个答案:

答案 0 :(得分: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}"/>

以上假设myItemSelectedListener类型的布局中存在OnItemSelectedListener变量。

如果您只想使用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(...),因为它将作为绑定的一部分完成。