web-dev-qa-db-ja.com

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

Dialogでデータバインディングを使用することは可能です。最初にDialogでバインディングを機能させるには、最初にそれを膨らませて、このように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));

そして今、あなたはそれが動作しているのを見ることができます。

58
Dullahan

以下は、データバインディングを使用したAlertDialogの完全な例です。

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

Androidドキュメントで述べたように、生成されたクラスにDataBindingUtilを使用しないでください。

生成されたバインディングクラスのinflatebindメソッド(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();
}

もっとシンプルにできますか?番号!

バインディングドキュメントDataBindingUtilクラスのinflate method

このバージョンは、layoutIdが事前に不明な場合にのみ使用してください。それ以外の場合は、生成されたBindingのinflateメソッドを使用して、タイプセーフなインフレーションを保証します。 DataBindingUtil.inflate(LayoutInflater.from(getContext())、R.layout.my_info_dialog_layout、null、false);

これは、すでにクラスがある場合、バインディング生成クラスを見つけることに似ています。

代わりにこれを使用してください

MyDialogBinding binding = MyDialogBinding.inflate(LayoutInflater.from(context));

または別のクラスを作成する場合。

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

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

Dialogを拡張したくない場合、別の解決策は次のとおりです。

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

それが役に立てば幸い。

0
Stefano F.