如何在Dialog中使用数据绑定?

我在对话框中实现数据绑定时遇到了麻烦。 可能吗?

以下是我的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> 

我想在一个对话框中绑定上面的布局。 这怎么可能? 下面是我尝试的Java代码,但它不工作

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

可以在一个对话框中使用数据绑定,首先得到你的对话框上的绑定,你应该先使它膨胀,然后像这样传递给setContentView。

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

然后你可以传递viewModel:

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

现在你可以看到它的工作。

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

这里是一个AlertDialog与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(); } } 

你可以在不调用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();