Lon*_*ger 3 data-binding android
我已经使用AppCompatSpinner作为我的片段,我想setOnItemSelectedListener()在我的布局中使用.我试着从这里使用教程部分
https://developer.android.com/topic/libraries/data-binding/index.html?hl=en#custom_setters
但它没有提供完成简单操作的完整示例.我也从这里寻找答案
我仍然不明白该怎么做.我想有一个完整的例子,用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>
Run Code Online (Sandbox Code Playgroud)
这是我的片段
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) {
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Geo*_*unt 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}"/>
Run Code Online (Sandbox Code Playgroud)
以上假设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}"/>
Run Code Online (Sandbox Code Playgroud)
这假定了一个handler类的方法:
public class Handler {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用lambda表达式:
android:onItemSelected="@{(p, v, pos, id) -> handler.onItemSelected(v, pos)}"
Run Code Online (Sandbox Code Playgroud)
这里,handler的类有一个方法:
public class Handler {
public void onItemSelected(View view, int position) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
在所有这些情况下,您必须分配处理程序或侦听器onCreateView,就像您在上面进行binding.setHandler(...)调用一样.您无需调用,lAppCompatSpinner.setOnItemSelectedListener(...)因为它将作为绑定的一部分完成.
| 归档时间: |
|
| 查看次数: |
4015 次 |
| 最近记录: |