কোটলিন অ্যাডটেক্সট চেঞ্জলিস্টার লাম্বদা?


109

আপনি কীভাবে কোটলিনে এডিটেক্সট অ্যাডটেক্সট চেঞ্জলিস্টনার জন্য ল্যাম্বডা এক্সপ্রেশন তৈরি করবেন? নীচে একটি ত্রুটি দেয়:

passwordEditText.addTextChangedListener { charSequence  ->
    try {
        password = charSequence.toString()
    } catch (error: Throwable) {
        raise(error)
    }
}

4
এটি কোন ত্রুটি দেয়?
ভদদান

উত্তর:


257

addTextChangedListener()TextWatcher3 টি পদ্ধতি সহ একটি ইন্টারফেস যা গ্রহণ করে। আপনি যা লিখেছেন তা TextWatcherকেবলমাত্র 1 টি পদ্ধতি থাকলে কাজ করবে । আমি ত্রুটিটি অনুমান করতে যাচ্ছি যে আপনি আপনার ল্যাম্বদা অন্যান্য 2 টি পদ্ধতি প্রয়োগ না করে সম্পর্কিত tes আপনার সামনে 2 টি বিকল্প রয়েছে।

  1. ল্যাম্বদা খাঁজুন এবং কেবল একটি বেনামে অভ্যন্তর শ্রেণি ব্যবহার করুন
    editText.addTextChangedListener(object : TextWatcher {
      override fun afterTextChanged(s: Editable?) {
      }
    
      override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
      }
    
      override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
      }
    })
  1. একটি এক্সটেনশন পদ্ধতি তৈরি করুন যাতে আপনি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারেন:
    fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
        this.addTextChangedListener(object : TextWatcher {
          override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
          }
    
          override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
          }
    
          override fun afterTextChanged(editable: Editable?) {
            afterTextChanged.invoke(editable.toString())
          }
        })
    }

এবং তারপরে এক্সটেনশনটি ব্যবহার করুন:

editText.afterTextChanged { doSomethingWithText(it) }

4
ব্যক্তিগত পছন্দ বা আরও ভাল স্টাইল কিনা তা নিশ্চিত নয়, তবে আপনার এক্সটেনশন ফাংশনটি একটি এক্সপ্রেশন বডিতে রূপান্তরিত হতে পারে ( fun foo() = ...)
এফ জর্জ

7
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu আপনি ঠিক বলেছেন যে এটি রূপান্তরিত হতে পারে। যাইহোক, এক লাইনের চেয়ে বেশি ফাংশনগুলির জন্য, আমি ফাংশনটি কোথায় শুরু হয় এবং কোথায় থামবে তা স্পষ্টভাবে চিহ্নিত করার জন্য আমার চারপাশের বন্ধনী থাকা চাই। আমি বিশ্বাস করি এটি পাঠযোগ্যতা বৃদ্ধি করে তবে এটি সম্পূর্ণ শৈলীর পছন্দ। আমি মনে করি এটি উভয় উপায়ে তর্ক করা যেতে পারে :)
অ্যান্ড্রু ওরোবেটর

4
আগ্রহের বাইরে: afterTextChanged.invoke(...)পরিবর্তে কেন ফোন করবেন afterTextChanged(...)?
ফেলিক্স ডি

এটি আমার পক্ষে কাজ করেছে। আমি পুনঃব্যবহারযোগ্যতার জন্য ২ য় বিকল্পটি পছন্দ করেছি।
ওনি ম্যানিয়েগো

23

কিছুটা পুরানো তবে কোটলিন অ্যান্ড্রয়েড এক্সটেনশান ব্যবহার করে আপনি এরকম কিছু করতে পারেন:

editTextRequest.textChangedListener {
            afterTextChanged {
                // Do something here...
            }
}

কোনও অতিরিক্ত কোডের প্রয়োজন নেই, কেবল যুক্ত করুন:

implementation 'androidx.core:core-ktx:1.0.0'

4
এটি আমার পক্ষে কাজ করছে না, এমনকি অ্যান্ড্রয়েড এক্সে রিফ্যাক্টর করার পরেও I আমি কী ভুল করতে পারি তার কোনও অনুমান?
নিকোলাস শিরমার

4
আমার জন্য কাজ করে না। দেখে মনে হচ্ছে কেটিএক্স এই এক্সটেনশনটি আর সরবরাহ করে না, তবে KAndroid সমাধান পুরোপুরি কার্যকর হয়।
ইগর ওয়াজদা

4
কেটিএক্সের সাথে: ১.০.১ আপনি বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স

23

এই মূল কেটিএক্স নির্ভরতা যুক্ত করুন

implementation 'androidx.core:core-ktx:1.0.0'

আপনি কেবল এটি করতে হবে

passwordEditText.doAfterTextChanged{ }


14

এটা পরীক্ষা করো :

passwordEditText.addTextChangedListener(object:TextWatcher{override fun afterTextChanged(s: Editable?) {

    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {

    }

})

12

আশা করি এই Kotlinনমুনা এটি পরিষ্কার করতে সহায়তা করবে:

class MainFragment : Fragment() {

    private lateinit var viewModel: MainViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View {
    val view = inflater.inflate(R.layout.main_fragment, container, false)

    view.user.addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {

        }

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {

        }

        override fun afterTextChanged(s: Editable) {
                userLayout.error =
                        if (s.length > userLayout.counterMaxLength) {
                            "Max character length is: ${userLayout.counterMaxLength}"
                        } else null
        }
    })
    return view
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    // TODO: Use the ViewModel
   }
}

এই XMLবিন্যাস সহ:

<android.support.design.widget.TextInputLayout
    android:id="@+id/userLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterMaxLength="5"
    app:counterEnabled="true"
    android:hint="user_name">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/user"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>

এবং এটি Gradle:

android {
    compileSdkVersion 'android-P'
...
}
    api 'com.android.support:design:28.0.0-alpha1'

    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1' // appcompat library

10

আপনি যদি ব্যবহার করেন implementation 'androidx.core:core-ktx:1.1.0-alpha05'আপনি ব্যবহার করতে পারেন

For android.widget.TextView
TextWatcher 
TextView.doBeforeTextChanged(crossinline action: (text: CharSequence?, start: Int, count: Int, after: Int) -> Unit)
Add an action which will be invoked before the text changed.

TextWatcher 
TextView.doOnTextChanged(crossinline action: (text: CharSequence?, start: Int, count: Int, after: Int) -> Unit)
Add an action which will be invoked when the text is changing.

TextWatcher 
TextView.doAfterTextChanged(crossinline action: (text: Editable?) -> Unit)

https://developer.android.com/references/kotlin/androidx/core/widget/package-summary# এক্সটেনশন- ফাংশন


4

দেরি করার জন্য দুঃখিত!

আপনি যদি implementation 'androidx.core:core-ktx:1.1.0'আপনার মডিউলটির বিল্ড.gradle ফাইলটিতে যোগ করেন তবে আপনি ব্যবহার করতে পারেন

etPlayer1.doOnTextChanged { text, start, count, after -> // Do stuff }

2

আর একটি বিকল্প KAndroidগ্রন্থাগার -

implementation 'com.pawegio.kandroid:kandroid:0.8.7@aar'

তাহলে আপনি এই জাতীয় কিছু করতে পারেন ...

editText.textWatcher { afterTextChanged { doSomething() } }

স্পষ্টতই আপনার সমস্যা সমাধানের জন্য একটি সম্পূর্ণ লাইব্রেরি ব্যবহার করা অত্যধিক, তবে এটি অ্যান্ড্রয়েড এসডিকে বয়লারপ্লেট কোডকে সরিয়ে দেয় এমন আরও অনেক দরকারী এক্সটেনশনগুলির সাথে আসে।


2

আপনি কোটলিনের নামযুক্ত পরামিতিগুলি ব্যবহার করতে পারেন:

private val beforeTextChangedStub: (CharSequence, Int, Int, Int) -> Unit = { _, _, _, _ -> }
private val onTextChangedStub: (CharSequence, Int, Int, Int) -> Unit = { _, _, _, _ -> }
private val afterTextChangedStub: (Editable) -> Unit = {}

fun EditText.addChangedListener(
        beforeTextChanged: (CharSequence, Int, Int, Int) -> Unit = beforeTextChangedStub,
        onTextChanged: (CharSequence, Int, Int, Int) -> Unit = onTextChangedStub,
        afterTextChanged: (Editable) -> Unit = afterTextChangedStub
) = addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
        beforeTextChanged(charSequence, i, i1, i2)
    }

    override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
        onTextChanged(charSequence, i, i1, i2)
    }

    override fun afterTextChanged(editable: Editable) {
        afterTextChanged(editable)
    }
})

1

মূল কেটিএক্স নির্ভরতা যুক্ত করুন

implementation 'androidx.core:core-ktx:1.3.0'

এবং আপনি কেবল এটির মতো বাস্তবায়ন করতে পারেন

    edit_text.addTextChangedListener { it: Editable? ->
      // Do your stuff here
    }

-9

এটি ঝরঝরে দেখাচ্ছে:

passwordEditText.setOnEditorActionListener { 
    textView, keyCode, keyEvent ->
    val DONE = 6

    if (keyCode == DONE) {                       
         // your code here
    }
    false
}

4
আমি আপনাকে ছেলেদের সাথে সত্যিই জানি না তবে আমার উত্তরটি আমার পক্ষে কাজ করেছে এবং উপরে এবং নীচের উত্তরের চেয়ে কম ...
লেমুএল অ্যাডান

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