2017-11-29 9 views
-1

を入力中には、私はedittext、その中のユーザーの種類@メンション#ハッシュの色が変化しなければならないときがあります。私はtextwatcherを使用しましたが、それは遅く、入力中にいくつかの文字が欠けています。私は選択肢について聞きたいです。のAndroidのEditText色の変化

これは私のコードです:

var previousString = "" 
     override fun initTextAreaView() { 
      if(twitterAvailable && twitterIsEnabled) CHARLIMIT = 280 
      if(!twitterIsEnabled && linkedInAvailable && linkedInIsEnabled) CHARLIMIT = 700 
      charcount.text = CHARLIMIT.toString() 
      content.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) { 
        if(s.toString()!=previousString)checkMentionsAndHashtags(s.toString()) 

       } 
      }) 
     } 

     var textSpanList: ArrayList<TextSpan> = ArrayList() 
     private fun checkMentionsAndHashtags(s: String) { 
      previousString = s 
      textSpanList = ArrayList() 
      val words = s.split(" ") 
      for(word in words){ 
       if(word.length>0) { 
        if (word[0] == '@' || word[0] == '#') { 
         val n = s.lastIndexOf(word) 
         textSpanList.add(TextSpan(n, (n+word.length))) 
        } 
       } 
      } 
      changeTextColor(s, SpannableStringBuilder(s)) 
     } 

     private fun changeTextColor(s: String = "", str: SpannableStringBuilder = SpannableStringBuilder("")) { 
      Log.d("TEXTSPANS", textSpanList.toString()) 
      if(textSpanList.size>0){ 
       for(span in textSpanList) { 
        str.setSpan(ForegroundColorSpan(resources.getColor(R.color.colorPrimary)), span.startPos, span.endPos, 0) 
       } 
      } 
      val cursorPos = content.selectionEnd 
      content.text = str 
      content.setSelection(cursorPos) 
     } 
+0

のように試してみて、私は1 [ライブラリ](https://github.com/tylersuehr7/social-text-viewました)これはあなたを助けるかもしれない –

+0

@HarshadPrajapatiそれはedittextとの仕事をしなかった。カーソル位置も扱っているので、edittextで作業する必要があります。提案ありがとう:) – Deepan

+0

私の更新された記事を参照してください..それはあなたに役立つ..その作品は私にうまく.. – Raja

答えて

0

あなたはこの

lateinit var content:EditText 
    private var intCount = 0 
    private var initialStringLength = 0 
    private var strText = "" 

    private fun initTextAreaView() { 
     content= findViewById(R.id.testText) 
     content.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) { 
       val typedString = s.toString() 
       val stringArrayObj = typedString.split(" ".toRegex()).dropLastWhile({ it.isEmpty() }).toTypedArray() 
       var cnt = 0 
       if (typedString.length != initialStringLength && typedString.length != 0) { 
        if (typedString.substring(typedString.length - 1) != " ") { 
         initialStringLength = typedString.length 
         cnt = intCount 
         for (i in stringArrayObj.indices) 
          if (stringArrayObj[i].get(0) == '#' || stringArrayObj[i].get(0) == '@') { 
           strText = strText + " " + "<font color='#EE0000'>" + stringArrayObj[i] + "</font>" 
          } 
          else 
           strText = strText + " " + stringArrayObj[i] 
        } 
        if (intCount == cnt) { 
         intCount = stringArrayObj.size 
         content.setText(Html.fromHtml(strText)) 
         content.setSelection(content.getText().toString().length) 
        } 
       } else { 
        strText = "" 
       } 

      } 
     }) 
    } 
+0

私のために仕事をしなかった。色は全く変化しませんでした。 – Deepan

+0

サンプル入力で試してみることはできますか? – Raja

+0

それは仕事をしなかった:( – Deepan

関連する問題