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

Nid*_*ice 44 data-binding android mvvm android-databinding

我在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>
Run Code Online (Sandbox Code Playgroud)

我想在Dialog中绑定上面的布局.这怎么可能?下面是我试过的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);
Run Code Online (Sandbox Code Playgroud)

小智 62

可以在Dialog中使用数据绑定,首先让你的Dialog上的绑定工作,你应该首先给它充气,然后像这样把它传递给setContentView.

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

然后你可以传递viewModel:

binding.setViewModel(new ViewModel(this, event.olaBooking));
Run Code Online (Sandbox Code Playgroud)

现在你可以看到它正常工作.

  • 使用绑定设置时,对话框未正确显示,并且它以正常方式工作 (5认同)
  • 这使我的底页对话框扩展到整个屏幕 (2认同)

IHe*_*oid 16

这是带有数据绑定的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();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 有时候人们只是在没有背景的情 所以有人(例如我)可能不知道在哪里放置有用的代码.感谢您发布完整的解决方案:). (5认同)

小智 12

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

  • 在应用这个解决方案时,我注意到建议的`LayoutInflater.from(getContext())`在对话框中给出了一个与使用数据绑定之前不同的主题.我最终使用`LayoutInflater`对话框提供如下:`dialog.getLayoutInflater()`或`LayoutInflater.from(dialog.getContext())` (3认同)

Khe*_*raj 10

您不应该DataBindingUtil按照Android文档中的说明使用生成的类

您应该使用生成的绑定类的 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();
}
Run Code Online (Sandbox Code Playgroud)

可以更简单吗?没有!

装订文件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));
Run Code Online (Sandbox Code Playgroud)

或者如果您想再上一堂课。

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());
    }
}
Run Code Online (Sandbox Code Playgroud)


far*_*njk 8

您可以执行相同操作而无需调用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();
Run Code Online (Sandbox Code Playgroud)