我已经使用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) {
}
}
}
}
答案 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(...)
,因为它将作为绑定的一部分完成。