J'ai du mal à implémenter la liaison de données dans une boîte de dialogue. C'est possible?
Ci-dessous est mon 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>
Je veux lier la disposition ci-dessus dans une boîte de dialogue. Comment est-ce possible? Ci-dessous est mon Java code que j'ai essayé mais ça ne fonctionne pas
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);
Il est possible d'utiliser la liaison de données dans une boîte de dialogue, tout d'abord pour que la liaison fonctionne sur votre boîte de dialogue, vous devez d'abord la gonfler et la passer à setContentView comme ceci.
DialogOlaBookingConfirmedBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout. dialog_ola_booking_confirmed, null, false);
setContentView(binding.getRoot());
Ensuite, vous pouvez passer le viewModel:
binding.setViewModel(new ViewModel(this, event.olaBooking));
Et maintenant, vous pouvez le voir fonctionner.
voici un exemple complet d'un AlertDialog avec 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();
}
}
mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.dialog_select, null, false);
setContentView(mBinding.getRoot());
SelectDialogBean data = new SelectDialogBean();
mBinding.setData(data);
DataBindingUtil
pour les classes générées comme indiqué dans Documentation AndroidVous devez utiliser les classes de liaison générées inflate
& bind
méthode (MyDialogBinding.inflate
).
public void showDialog(final Context context) {
Dialog dialog = new Dialog(context);
MyDialogBinding binding = MyDialogBinding.inflate(LayoutInflater.from(context));
dialog.setContentView(binding.getRoot());
dialog.show();
}
Document contraignant dit pour DataBindingUtil
classe inflate method
.
Utilisez cette version uniquement si layoutId est inconnu à l'avance. Sinon, utilisez la méthode de gonflement de la liaison générée pour garantir un gonflage sûr. DataBindingUtil.inflate (LayoutInflater.from (getContext ()), R.layout.my_info_dialog_layout, null, false);
C'est comme trouver une classe générée par liaison, quand nous avons déjà une classe.
MyDialogBinding binding = MyDialogBinding.inflate(LayoutInflater.from(context));
ou si vous voulez faire un autre cours.
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyDialogBinding binding = MyDialogBinding.inflate(LayoutInflater.from(getContext()));
setContentView(binding.getRoot());
}
}
Vous pouvez faire de même sans appeler 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();
Si vous ne voulez pas étendre Dialog
, une autre solution possible pourrait être:
Dialog dialog = new Dialog(this); // where "this" is the context
YourClassNameBinding binding = DataBindingUtil.inflate(dialog.getLayoutInflater(), R.layout.your_layout, null, false);
binding.setYourData(yourData);
dialog.setContentView(binding.getRoot());
dialog.show();
J'espère que ça aide.