2016-01-23 16 views
22

Mam problemy z implementowaniem powiązania danych w oknie dialogowym. Czy to możliwe?Jak korzystać z powiązania danych w oknie dialogowym?

Poniżej znajduje się mój xml.

<data> 

    <variable 
     name="olaBooking" 
     type="com.example.myapp.viewmodels.ViewModel" /> 
</data> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.CardView 
     android:id="@+id/cv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="15dp" 
     android:elevation="4dp" 
     android:padding="15dp"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/colorPrimary" 
       android:gravity="center" 
       android:padding="15dp" 
       android:text="OLA Cab Booked !" 
       android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> 

      <View 
       android:layout_width="match_parent" 
       android:layout_height="2dp" 
       android:background="@color/colorPrimaryDark" /> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="start|center" 
       android:padding="15dp" 
       android:text="Car Details" /> 

      <View 
       android:layout_width="match_parent" 
       android:layout_height="2dp" 
       android:background="@color/colorPrimaryDark" /> 

      <TextView 
       android:id="@+id/driverName" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="5dp" 
       android:text="@{olaBooking.driverName}" /> 

      <TextView 
       android:id="@+id/carModel" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="5dp" 
       android:text="@{olaBooking.getCarName}" /> 

      <TextView 
       android:id="@+id/carNo" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="5dp" 
       android:text="@{olaBooking.getCabNo}" /> 

      <TextView 
       android:id="@+id/eta" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="5dp" 
       android:text="@{olaBooking.getEta}" /> 
     </LinearLayout> 
    </android.support.v7.widget.CardView> 
</LinearLayout> 

chcę wiązać powyższy układ w oknie dialogowym. Jak to jest możliwe? Poniżej jest kod Java Próbowałem, ale to nie działa

 dialog.setContentView(R.layout.dialog_ola_booking_confirmed); 
    DialogOlaBookingConfirmedBinding binding = DataBindingUtil.inflate(
      LayoutInflater.from(dialog.getContext()), 
      R.layout.dialog_ola_booking_confirmed, 
      (ViewGroup) dialog.findViewById(R.id.cv), 
      false); 
    ViewModel viewModel = new ViewModel(this, event.olaBooking); 

Odpowiedz

26

Jest możliwe użycie wiązania z danymi w oknie dialogowym, należy najpierw uzyskać wiążące pracy na Dialog należy go napompować pierwszy i przekazać je do setContentView w ten sposób.

DialogOlaBookingConfirmedBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout. dialog_ola_booking_confirmed, null, false); 
setContentView(binding.getRoot()); 

Następnie można przejść ViewModel:

binding.setViewModel(new ViewModel(this, event.olaBooking)); 

I teraz widać to działa.

+1

okno dialogowe nie wyświetla się poprawnie po ustawieniu za pomocą bindowania i działa normalnie –

10
mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.dialog_select, null, false); 
    setContentView(mBinding.getRoot()); 
    SelectDialogBean data = new SelectDialogBean(); 
    mBinding.setData(data); 
+1

Po zastosowaniu tego rozwiązania zauważyłem, że zasugerowane 'LayoutInflater.from (getContext())' daje mi inny motyw wewnątrz okna dialogowego niż przed użyciem wiązania danych. Skończyło się na użyciu 'LayoutInflater', które zapewnia okno dialogowe:' dialog.getLayoutInflater() 'lub' LayoutInflater.from (dialog.getContext()) ' – splatte

7

tutaj jest pełna przykładów AlertDialog z Databinding:

import android.app.Dialog; 
import android.databinding.DataBindingUtil; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v7.app.AlertDialog; 
import android.view.LayoutInflater; 


public class MyDialog extends DialogFragment { 

    private static final String KEY_MY_INFO = "KEY_MY_INFO"; 

    private String myInfo; 

    public static MyDialog newInstance(String myInfo) { 
     MyDialog dialog = new MyDialog(); 
     Bundle bundle = new Bundle(); 
     bundle.putString(KEY_MY_INFO, myInfo); 
     dialog.setArguments(bundle); 
     return dialog; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myInfo = getArguments().getString(KEY_MY_INFO); 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     FragmentActivity activity = getActivity(); 

     MyInfoBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), 
       R.layout.my_info_dialog_layout, null, false); 

     binding.setMyInfo(myInfo); 

     return new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle) 
       .setView(binding.getRoot()) 
       .create(); 
    } 

} 
+2

Czasami ludzie po prostu publikują swoje odpowiedzi bez kontekstu. Więc ktoś (ja na przykład) może nie mieć pojęcia, gdzie umieścić kod, który zadziałał. Dziękujemy za opublikowanie pełnego rozwiązania :). –

4

Można zrobić to samo bez wywoływania getRoot().

View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_delete_confirmation, null, false); 

mBinding = DialogDeleteConfirmationBinding.bind(view); 

mBinding.setViewModel(viewModel); 

builder.setView(view); 

builder.create();