2016-08-25 4 views
3

Ich habe AppCompatSpinner für mein Fragment verwendet und ich möchte setOnItemSelectedListener() in meinem Layout verwenden. Ich habe versucht, das Tutorial AbschnittBenutzerdefinierte XML-Attribut auf Android-Datenbindung

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

von hier zu verwenden, aber es bietet keine vollständige Beispiel die einfache Aktion zu tun. Und ich sehe auch für die Antwort von hier

android databinding in custom controls

und ich noch dun verstehen, wie es zu tun. würde ich ein komplettes Beispiel haben, mag die einfache benutzerdefinierte mit einigen Attributen Bindung zu tun, die nicht in XML-Attribut existiert hat, aber es ist in der UI-Steuerelement

nützlich

Hier ist meine 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> 

Hier mein Fragment

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) { 
      } 
     } 
    } 
} 

Antwort

7

Sie besondere brauchen etwas nicht den OnItemSelectedListener zuzuordnen:

<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}"/> 

Das obige setzt eine Variable in Ihrem Layout des Typs OnItemSelectedListener voraus.

Wenn Sie nur die onItemSelected oder onNothingSelected verwenden möchten, können Sie das Attribut im Layout bereits verwenden:

<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}"/> 

Dies setzt voraus, eine Methode auf handler ‚s Klasse:

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

Sie kann auch einen Lambda-Ausdruck verwenden:

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

Hier, Handler ' s-Klasse hat eine Methode:

public class Handler { 
    public void onItemSelected(View view, int position) { 
     //... 
    } 
} 

In all diesen Fällen müssen Sie den Handler oder Hörer in den onCreateView zuweisen, wie Sie oben mit dem binding.setHandler(...) Anruf zu tun. Sie müssen lAppCompatSpinner.setOnItemSelectedListener(...) nicht aufrufen, da dies als Teil der Bindung erfolgt.

Verwandte Themen