web-dev-qa-db-fra.com

Comment utiliser la liaison de données dans Dialog?

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);
42
Nidhin Rejoice

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.

58
Dullahan

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

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

Vous ne devez pas utiliser DataBindingUtil pour les classes générées comme indiqué dans Documentation Android

Vous 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();
}

Peut-il être plus simple? Non!

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.

Utilisez plutôt ceci

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());
    }
}
8
Khemraj

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();
6
farhanjk

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.

0
Stefano F.