কীভাবে ফ্রেগমেন্টের সাথে ডেটা-বাইন্ডিং ব্যবহার করবেন


182

আমি অফিশিয়াল গুগল ডক https://developer.android.com/tools/data-binding/guide.html থেকে ডেটা বন্ডিং উদাহরণ অনুসরণ করার চেষ্টা করছি

এটি ব্যতীত আমি কোনও খণ্ডনের জন্য ডেটা-বিডিং প্রয়োগ করার চেষ্টা করছি, কোনও কার্যকলাপ নয়।

সংকলন করার সময় আমি বর্তমানে যে ত্রুটিটি পাচ্ছি

Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.

onCreate খণ্ডের জন্য এটি দেখতে দেখতে:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
    binding.setMarsdata(this);
}

onCreateView খণ্ডের জন্য এটি দেখতে দেখতে:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.martian_data, container, false);
}

এবং খণ্ডের জন্য আমার লেআউট ফাইলের অংশগুলি দেখতে এই রকম দেখাচ্ছে:

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="marsdata"
            type="uk.co.darkruby.app.myapp.MarsDataProvider" />
    </data>
...

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@{marsdata.martianSols}"
        />

    </RelativeLayout>
</layout>

আমার সন্দেহ এটি MartianDataBindingকোন লেআউট ফাইলের সাথে আবদ্ধ হওয়ার কথা বলে তা জানে না - সুতরাং ত্রুটি। কোনও পরামর্শ?

উত্তর:


354

ডেটা বাঁধাইয়ের প্রয়োগটি অবশ্যই onCreateViewখণ্ডটির OnCreateপদ্ধতিতে onCreateViewহওয়া উচিত , আপনার পদ্ধতিতে বিদ্যমান যে কোনও ডেটা বন্ডিং মুছে ফেলতে হবে , আপনার এইরকম দেখতে হবে:

public View onCreateView(LayoutInflater inflater, 
                         @Nullable ViewGroup container, 
                         @Nullable Bundle savedInstanceState) {
    MartianDataBinding binding = DataBindingUtil.inflate(
            inflater, R.layout.martian_data, container, false);
    View view = binding.getRoot();
    //here data must be an instance of the class MarsDataProvider
    binding.setMarsdata(data);
    return view;
}

আমার বাইন্ডিং ক্লাসটি জেনারেট করার জন্য আমাকে কলটিতে সুপার যুক্ত করতে হয়েছিল।
joey_g216

3
আমি এই সমস্যাটি নিয়ে ঘন্টার পর ঘন্টা লড়াই করি। সমস্যাটি ছিল আমি ভুল দৃষ্টিভঙ্গি ফিরিয়েছি। +1
থারাকা নির্মনা

1
View view = binding.getRoot(); আমি এটির জন্য এত দিন আটকে ছিলাম যে আমি বৈধভাবে বেশ বিচলিত যে বিকাশকারী ও অ্যান্ড্রয়েড.কম এ আমি কোনও নথিপত্র খুঁজে পাইনি ... সমস্যাটি সমাধান করেছেন। ধন্যবাদ!
ভিক্টর উদে

1
আপনি যদি লাইভডেটা এবং ভিউমোডেল ব্যবহার করেন তবে এই উত্তরটি অবশ্যই পড়বেন তা নিশ্চিত করুন ।
বিগ ম্যাকলার্জহিউজ

1
সেটমার্সডটা () কী? আমি মনে করি এখানে আমরা সেটভিউমোডেল () ব্যবহার করি ??
suv

59

inflateআপনার উত্পন্ন বাঁধাইয়ের পদ্ধতিটি ব্যবহার করতে আপনাকে উত্সাহিত করা হয় ডেটাবাইন্ডিংটিটিলটি নয়:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false);
    //set variables in Binding
    return binding.getRoot();
}

ডেটাবাইন্ডিংটিল.ইনফ্লেট () এর জন্য ডক্স :

লেআউটআইডটি আগে থেকেই অজানা থাকলে এই সংস্করণটি ব্যবহার করুন। অন্যথায়, টাইপ-নিরাপদ মুদ্রাস্ফীতি নিশ্চিত করতে উত্পন্ন বাইন্ডিংয়ের স্ফীত পদ্ধতিটি ব্যবহার করুন।


দুর্ভাগ্যক্রমে এটি আমাকে cannot be resolved to a typeনির্মাণের ত্রুটির সাথে হত্যা করছে । এটি আমার মতে বিশ্বাসযোগ্য নয়। যদি আমি প্রথমে এর সাথে যাই DataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);এবং তারপরে এটিতে পরিবর্তন করি তবে FragmentCameraBinding.inflate(inflater, container, false);এটি কাজ করে তবে এটি পুনর্নির্মাণের পরে আবার ত্রুটি দেয়।
অ্যালেক্স বারডুজেল

দুর্দান্ত কাজ করে। প্রকৃতপক্ষে উত্পন্ন বাঁধাই ফাইলটি থেকে স্বয়ংক্রিয়ভাবে পিক্স করা হওয়ায় প্রকৃতপক্ষে বিন্যাসের পুনরায় আইডি নির্দিষ্ট করার দরকার নেই (যা আমি আগে ভাবছিলাম)।
ইসি ড্রয়েড

2
আপনি এই উদাহরণে খণ্ড লেআউট আইডিটি (যেমন। আর.আলআউটআউট.ফ্রেগমেন্ট_) সেট করবেন?
লেনিন রাজ রাজাসেকরন 6:38

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বাঁধাই উত্পন্ন লেআউট, ব্যবহার করা হবে পরিবর্তে উত্সাহ দেওয়া হয়DataBindingUtil.inflate
mochadwi

@ লেনিনরাজরাজেসেকরণ লেআউট আইডি ব্যবহারের মাধ্যমে বোঝানো হয়েছে MainFragmentBinding ক্লাস । সেই শ্রেণিটি বিন্যাস ফাইল থেকে উত্পন্ন হয় যাতে পছন্দসই বিন্যাসটি স্বয়ংক্রিয়ভাবে প্রয়োগ হয় is
এমিল এস।

19

এমনকি অন্যান্য উত্তরগুলি ভাল কাজ করতে পারে তবে আমি সেরা পদ্ধতির বলতে চাই।

অ্যান্ড্রয়েড ডকুমেন্টেশনBinding class's inflate হিসাবে প্রস্তাবিত হিসাবে ব্যবহার করুন ।

একটি বিকল্প দ্বারা স্ফীত করা হয় DataBindingUtil যখন কেবল যখন আপনি জানেন না যে বন্ডিং ক্লাস তৈরি করেছে

- আপনি স্বয়ংক্রিয় উত্পন্ন করেছেন binding class, ব্যবহারের পরিবর্তে সেই শ্রেণিটি ব্যবহার করুন DataBindingUtil

জাভাতে

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    HomeFragmentBinding binding = HomeFragmentBinding.inflate(inflater, container, false);
    //set binding variables here
    return binding.getRoot();
}

কোটলিনে

lateinit var binding: HomeFragmentBinding 
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = HomeFragmentBinding.inflate(inflater, container, false)
    return binding.root
}

ভিতরে DataBindingUtil বর্গ ডকুমেন্টেশন আপনি দেখতে পারেন।

ফোলান

T inflate (LayoutInflater inflater, 
                int layoutId, 
                ViewGroup parent, 
                boolean attachToParent)

লেআউটআইডটি আগে থেকেই অজানা থাকলে এই সংস্করণটি ব্যবহার করুন। অন্যথায়, টাইপ-নিরাপদ মুদ্রাস্ফীতি নিশ্চিত করতে উত্পন্ন বাইন্ডিংয়ের স্ফীত পদ্ধতিটি ব্যবহার করুন।

যদি আপনার লেআউট বিনাইডিং ক্লাসটি উত্পন্ন না হয় তবে এই উত্তরটি দেখুন


কেন একমাত্র যুক্তি হিসাবে inflateগ্রহণ পদ্ধতি না LayoutInflater?
ফ্লোরিয়ান ওয়ালথার

@ ফ্লোরিয়ানওয়ালার এটি ছাড়া ViewGroup containerকি কাজ করে ?
খেমরাজ

ঠিক আছে, আমি জানি না আমি কখন এই মন্তব্যটি লিখেছি। তবে আমি এখানে কিছু ভাল উত্তর পেয়েছি: স্ট্যাকওভারফ্লো.com
ফ্লোরিয়ান ওয়ালথের

1
@ ফ্লোরিয়ানওয়াল্টার ঠিক আছে, আমি উত্তরটি পড়েছি, containerযখন প্রয়োজন তখন attachToRootএটি প্রয়োজন true
খেমরাজ

16

আপনি যদি ভিউমোডেল এবং লাইভ ডেটা ব্যবহার করেন তবে এটি যথেষ্ট সিনট্যাক্স

কোটলিন সিনট্যাক্স:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return MartianDataBinding.inflate(
        inflater,
        container,
        false
    ).apply {
        lifecycleOwner = viewLifecycleOwner
        vm = viewModel    // Attach your view model here
    }.root
}

10

অ্যান্ড্রয়েড ডেটাবাইন্ডিং এ এটি ব্যবহার করে দেখুন

FragmentMainBinding binding;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
        View rootView = binding.getRoot();
        initInstances(savedInstanceState);
        return rootView;
}

7

নীচে উল্লিখিত মতামত প্রত্যক্ষভাবে ভিউ অবজেক্টটি পুনরুদ্ধার করতে পারবেন

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot();

return view;

}

7

কোটলিন সিনট্যাক্স:

lateinit var binding: MartianDataBinding
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = DataBindingUtil.inflate(inflater, R.layout.martian_data, container, false)
    return binding.root
}

6

ঠিক যেমন অধিকাংশ লোক বলল, কিন্তু সেট করতে ভুলবেন আত LifeCycleOwner
জাভা নমুনা অর্থাত

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    BindingClass binding = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
    ModelClass model = ViewModelProviders.of(getActivity()).get(ViewModelClass.class);
    binding.setLifecycleOwner(getActivity());
    binding.setViewmodelclass(model);

    //Your codes here

    return binding.getRoot();
}

5

আমার কোডে কাজ করছি।

private FragmentSampleBinding dataBiding;
private SampleListAdapter mAdapter;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    dataBiding = DataBindingUtil.inflate(inflater, R.layout.fragment_sample, null, false);
    return mView = dataBiding.getRoot();
}

5

ডেটা বাঁধাইকরণ খণ্ডগুলির একটি সম্পূর্ণ উদাহরণ

ফ্রেগমেন্টমাইপ্রগ্রামবাইন্ডিং রেজ / লেআউট / ফ্রেগমেন্ট_মি_প্রগ্রামগুলির জন্য উত্পন্ন বাঁধাই ক্লাস

public class MyPrograms extends Fragment {
    FragmentMyProgramsBinding fragmentMyProgramsBinding;

    public MyPrograms() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
    FragmentMyProgramsBinding    fragmentMyProgramsBinding = DataBindingUtil.inflate(inflater, R
                .layout.fragment_my_programs, container, false);
        return fragmentMyProgramsBinding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }
}

2

ডেটাবাইন্ডিং সম্পর্কে খুব সহায়ক ব্লগ: https://link.medium.com/HQY2VizKO1

class FragmentBinding<out T : ViewDataBinding>(
    @LayoutRes private val resId: Int
) : ReadOnlyProperty<Fragment, T> {

    private var binding: T? = null

    override operator fun getValue(
        thisRef: Fragment,
        property: KProperty<*>
    ): T = binding ?: createBinding(thisRef).also { binding = it }

    private fun createBinding(
        activity: Fragment
    ): T = DataBindingUtil.inflate(LayoutInflater.from(activity.context),resId,null,true)
}

ফ্রেমমেন্টে এই জাতীয় বাঁধাইয়ের ভ্যালার ঘোষণা করুন:

private val binding by FragmentBinding<FragmentLoginBinding>(R.layout.fragment_login)

ভগ্নাংশ এ লিখতে ভুলবেন না

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return binding.root
}

1

কোটলিনের আরও একটি উদাহরণ:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val binding = DataBindingUtil
            .inflate< MartianDataBinding >(
                    inflater,
                    R.layout.bla,
                    container,
                    false
            )

    binding.modelName = // ..

    return binding.root
}

নোট করুন যে "মার্টিয়ানডাটাবাইন্ডিং" নামটি লেআউট ফাইলের নামের উপর নির্ভর করে। যদি ফাইলটির নাম "মার্টিয়ান_ডাটা" হয় তবে সঠিক নামটি মার্টিয়ানডাটা বাইন্ডিং হবে।


0

সবাই এর সম্পর্কে বলে inflate(), তবে আমরা যদি এটি ব্যবহার করতে চাই তবে কী হবে onViewCreated()?

উদাহরণস্বরূপ bind(view)আপনি কংক্রিট বাঁধাই ক্লাসের পদ্ধতিটি ব্যবহার করতে পারেন ।ViewDataBindingview


সাধারণত আমরা বেসফ্রেগমেন্ট এ জাতীয় কিছু (সরলীকৃত) লিখি:

// BaseFragment.kt
abstract fun layoutId(): Int

override fun onCreateView(inflater, container, savedInstanceState) = 
    inflater.inflate(layoutId(), container, false)

এবং শিশু খণ্ডে এটি ব্যবহার করুন।

// ConcreteFragment.kt
override fun layoutId() = R.layout.fragment_concrete

override fun onViewCreated(view, savedInstanceState) {
    val binding = FragmentConcreteBinding.bind(view)
    // or
    val binding = DataBindingUtil.bind<FragmentConcreteBinding>(view)
}


যদি সমস্ত খণ্ড ডেটা বাইন্ডিং ব্যবহার করে তবে আপনি টাইপ প্যারামিটারটি ব্যবহার করে এটিকে আরও সহজ করতে পারেন।

abstract class BaseFragment<B: ViewDataBinding> : Fragment() {
    abstract fun onViewCreated(binding: B, savedInstanceState: Bundle?)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        onViewCreated(DataBindingUtil.bind<B>(view)!!, savedInstanceState)
    }
}

আমি জানি না যে সেখানে নন-নাল যুক্ত করা ঠিক আছে, তবে .. আপনি ধারণাটি পেয়ে যান। আপনি যদি এটি অযোগ্য হতে চান তবে আপনি এটি করতে পারেন can

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.