2016-01-23 10 views
22

Ho problemi nell'implementare l'associazione dati in una finestra di dialogo. È possibile?Come utilizzare l'associazione dati nella finestra di dialogo?

Di seguito è riportato il mio 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> 

voglio legare il layout di cui sopra in una finestra di dialogo. Come è possibile? Qui di seguito è il mio codice Java ho provato ma non funziona

 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); 

risposta

26

E 'possibile utilizzare l'associazione dati in una finestra di dialogo, prima di ottenere il legame a lavorare sulla sua finestra di dialogo è necessario gonfiare prima e passarlo al setContentView come questo.

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

Poi si può passare il ViewModel:

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

E ora si può vedere che funziona.

+1

non viene visualizzata correttamente se impostata utilizzando l'associazione e funziona in modo normale –

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

Quando si applica questa soluzione, ho notato che il suggerito 'LayoutInflater.from (getContext())' mi dà un tema diverso all'interno della finestra di dialogo che prima di utilizzare l'associazione dati. Ho finito per usare 'LayoutInflater' la finestra di dialogo fornisce in questo modo:' dialog.getLayoutInflater() 'o' LayoutInflater.from (dialog.getContext()) 'La finestra di dialogo – splatte

7

ecco un esempio completo di un AlertDialog con 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

A volte le persone semplicemente pubblicano le loro risposte senza un contesto. Quindi qualcuno (io per esempio) potrebbe non avere idea di dove mettere il codice che ha funzionato. Grazie per aver pubblicato una soluzione completa :). –

4

si può fare lo stesso senza chiamare 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();