2016-01-23 29 views
22

Tôi gặp sự cố khi triển khai dữ liệu trong Hộp thoại. Có thể không?Cách sử dụng ràng buộc dữ liệu trong Hộp thoại?

Dưới đây là xml của tôi.

<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> 

Tôi muốn ràng buộc bố trí ở trên trong một Dialog. Làm thế nào là nó có thể? Dưới đây là mã java của tôi tôi đã cố gắng nhưng nó không làm việc

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

Trả lời

26

Có thể sử dụng liên kết dữ liệu trong một Dialog, đầu tiên để có được những ràng buộc làm việc trên Dialog của bạn, bạn nên thổi phồng nó đầu tiên và vượt qua nó để setContentView như thế này.

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

Sau đó, bạn có thể vượt qua các ViewModel:

binding.setViewModel(new ViewModel(this, event.olaBooking)); 

Và bây giờ bạn có thể nhìn thấy nó làm việc.

+1

không hiển thị đúng khi được đặt bằng cách sử dụng ràng buộc và nó hoạt động theo cách thông thường –

10
mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.dialog_select, null, false); 
    setContentView(mBinding.getRoot()); 
    SelectDialogBean data = new SelectDialogBean(); 
    mBinding.setData(data); 
+1

Khi áp dụng giải pháp này, tôi nhận thấy đề xuất 'LayoutInflater.from (getContext())' cung cấp cho tôi một chủ đề khác trong hộp thoại hơn trước khi sử dụng ràng buộc dữ liệu. Tôi đã kết thúc bằng cách sử dụng 'LayoutInflater' hộp thoại cung cấp như sau: hộp thoại' dialog.getLayoutInflater() 'hoặc' LayoutInflater.from (dialog.getContext()) ' – splatte

7

đây là một ví dụ đầy đủ của một AlertDialog với 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(); 
    } 

} 
+2

Đôi khi mọi người chỉ đăng câu trả lời của họ mà không cần bối cảnh. Vì vậy, ai đó (ví dụ tôi) có thể không có đầu mối về nơi để đặt mã mà làm việc. Cảm ơn bạn đã đăng một giải pháp đầy đủ :). –

4

Bạn có thể làm như vậy mà không gọi 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(); 
Các vấn đề liên quan