ভিউমোডেল, লাইভ ডেটা এবং ডেটা বাইন্ডিংয়ের জন্য
EditText
আমার নোটস অ্যাপ্লিকেশনটিতে মাল্টলাইন সমর্থন করার জন্য আমার এই কার্যকারিতাটি দরকার । আমি পাঠকের শেষে কার্সারটি চেয়েছিলাম যখন ব্যবহারকারী নোট টেক্সটযুক্ত টুকরোটিতে নেভিগেট করে।
Djleop দ্বারা প্রস্তাবিত সমাধানটি কাছে আসে। তবে এর সাথে সমস্যাটি হ'ল, যদি ব্যবহারকারী সম্পাদনা করার জন্য কার্সারটিকে পাঠ্যের মাঝখানে কোথাও রেখে দেয় এবং টাইপ করা শুরু করে, কার্সারটি আবার পাঠ্যের শেষে চলে যায়। এটি ঘটেছে কারণLiveData
নতুন মানটি নির্গত হবে এবং কার্সার আবার পাঠ্যের শেষে চলে যাবে যার ফলস্বরূপ ব্যবহারকারী মাঝখানে কোথাও পাঠ্য সম্পাদনা করতে সক্ষম হবে না।
এটি সমাধানের জন্য, আমি এটি ব্যবহার MediatorLiveData
এবং এটি String
একবার ব্যবহার করে একবার ব্যবহার করার দৈর্ঘ্য নির্ধারণ করি । এটি লাইভডেটা কেবল একবার মানটি পড়তে বাধ্য করবে, এটি হ'ল যখন ব্যবহারকারী টুকরাটিতে নেভিগেট করবে। এর পরে ব্যবহারকারী সেখানে পাঠ্য সম্পাদনা করতে চান সেখানে কার্সারটি রাখতে পারেন।
ViewModel
private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {
addSource(yourObject) { value ->
if(!accessedPosition) {
setValue(Event(yourObject.note.length))
accessedPosition = true
}
}
}
এখানে, yourObject
ডাটাবেস থেকে আর একটি লাইভ ডেটা পুনরুদ্ধার করা হয়েছে যা আপনি স্ট্রিংয়ের পাঠ্যটিতে প্রদর্শন করছেন inEditText
।
তারপরে MediatorLiveData
বাঁধাইকারী অ্যাডাপ্টার ব্যবহার করে এটি আপনার সম্পাদনা পাঠ্যবন্ধকে আবদ্ধ করুন ।
এক্সএমএল
পাঠ্য ইনপুট গ্রহণের পাশাপাশি পাঠ্য প্রদর্শন করার জন্য দ্বি-মুখী ডেটা বাইন্ডিং ব্যবহার করে।
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android:text="@={viewModel.noteText}"
cursorPosition="@{viewModel.cursorPosition}" />
বাঁধাই অ্যাডাপ্টার
@BindingAdapter("cursorPosition")
fun bindCursorPosition(editText: EditText, event: Event<Int>?) {
event?.getContentIfNotHandled()?.let { editText.setSelection(it) }
}
Event
শ্রেণী
এখানে Event
ক্লাসটি গুগলের জোসে আলকারিরকা দ্বারা লিখিত একক লাইভএভেন্টের মতো । আমি এখানে স্ক্রিন রোটেশন যত্ন নিতে ব্যবহার। সিঙ্গল ব্যবহার করে Event
নিশ্চিত করা হবে যে ব্যবহারকারী যখন পাঠ্যটির মাঝখানে কোথাও সম্পাদনা করছেন এবং স্ক্রিনটি ঘোরবে তখন কার্সারটি পাঠ্যের শেষের দিকে চলে যাবে না। স্ক্রিনটি ঘোরার সময় এটি একই অবস্থান বজায় রাখবে।
এখানে Event
ক্লাস:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
এটি আমার জন্য কাজ করে এমন একটি সমাধান এবং ভাল ব্যবহারকারীর অভিজ্ঞতা সরবরাহ করে। আশা করি এটি আপনার প্রকল্পগুলিতেও সহায়তা করবে।