ダイアログにデータバインディングを実装するのに問題があります。出来ますか?
以下は私の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);
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));
そして今、あなたはそれが動作しているのを見ることができます。
以下は、データバインディングを使用した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();
}
}
mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.dialog_select, null, false);
setContentView(mBinding.getRoot());
SelectDialogBean data = new SelectDialogBean();
mBinding.setData(data);
DataBindingUtil
を使用しないでください。生成されたバインディングクラスのinflate
&bind
メソッド(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());
}
}
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();
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();
それが役に立てば幸い。