Как связать кликабельное слово с TextWatcher в EditText в Android?

У меня есть строка в андроиде:

String meow =  "this_is_part1_and_here_another_and_another_one";

Я сделал каждое слово кликабельным, используя Clickable span.

Ниже приведен код для реализации интерактивного диапазона для каждого слова (адаптированный из одного из ответов Stack Overflow).

    String meow =  "this_is_part1_and_here_another_and_another_one";
    String[] tokens = meow.split("_");

    ArrayList<String> tokenList = new ArrayList<String>(Arrays.asList(tokens));


    if (meow != null || meow.length() != 0  ) {
        _field.setMovementMethod(LinkMovementMethod.getInstance());
        _field.setText(addClickablePart(meow, tokenList), EditText.BufferType.SPANNABLE);


    //  _field.addTextChangedListener(new TextWatcher() {
    //
    //  @Override
    //  public void afterTextChanged(Editable s) {
    //  Editable ab = new SpannableStringBuilder(s.toString().replace("A", "a"));
    //  _field.setText(ab);
    //  Toast.makeText(getApplicationContext(), s.toString(),Toast.LENGTH_LONG).show();
    // 
    //      }
    //
    //  @Override
    //  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    //        }
    //
    //  @Override
    //  public void onTextChanged(CharSequence s, int start, int before, int count) {
    //
    //       }
    //       });

}



private SpannableStringBuilder addClickablePart(String str, ArrayList<String> clickableWords) {
    SpannableStringBuilder ssb = new SpannableStringBuilder(str);

    for (String clickableWord : clickableWords) {
        int idx1 = str.indexOf(clickableWord);
        int idx2 = 0;
        while (idx1 != -1) {
            idx2 = idx1 + clickableWord.length();
            final String clickString = str.substring(idx1, idx2);
            ssb.setSpan(new MyClickableSpan(clickString), idx1, idx2, 0);
            idx1 = str.indexOf(clickableWord, idx2);
        }
    }

    return ssb;
}



class MyClickableSpan extends ClickableSpan {



String clicked;
public MyClickableSpan(String string) {
    super();
    clicked = string;
   }

public void onClick(View widget) {
    Toast.makeText(widget.getContext(), clicked, Toast.LENGTH_LONG).show();

   }

public void updateDrawState(TextPaint ds) {// override updateDrawState
    ds.setUnderlineText(false); // set to false to remove underline
   }

}

Когда я нажимаю на определенное слово, я показываю тост этого слова. Теперь, что я хочу, так это то, что когда я нажимаю на это конкретное слово, после показа этого слова в течение нескольких секунд, это слово становится пустым в EditText, и я набираю новое слово на его месте и получаю эту конкретную строку.

Например, в EditText показано следующее:

this_is_part1_and_here_another_and_another_one

Я нажимаю на слово part1. После отображения part1 в тосте в течение нескольких секунд слово становится пустым в EditText следующим образом:

это_есть_ _и_здесь_другой_и_другой_один

Теперь я набираю вместо него новое слово, скажем woof

this_is_woof_and_here_another_and_another_one

И я могу сохранить слово woof в строке.

Как это сделать? Короче говоря, как мне сделать так, чтобы мои интерактивные слова ассоциировались с TextWatcher? Я прокомментировал часть TextWatcher, так как не знаю, как связать ее с ClickableSpan. Пожалуйста, помогите мне в этом. Спасибо.


person Partho Mandal    schedule 11.04.2016    source источник
comment
В какой строке хранить слово woof?   -  person T D Nguyen    schedule 12.04.2016
comment
Это просто пример. Я хочу сохранить все предыдущие кликабельные слова и все отредактированные слова на месте этого слова на карте/мультикарте.   -  person Partho Mandal    schedule 12.04.2016


Ответы (1)


Я не думаю, что вы можете «гиперсвязать» разные слова в диапазоне. Вы просто получаете текстовое представление на прослушивателе кликов. Я предлагаю вам создать ViewGroup, который инкапсулирует одно или несколько слов и может реагировать на клики по отдельным словам,

class HyperText extends LinearLayout {
  ...
  public static interface OnTextClickedListener {
    public void onTextClicked(String text);
  }   


  public void addText(String text) {
    TextView tv = new TextView(...); // or inflate it from somewhere
    tx.setOnClickListener(...); // call onTextClicked(this.getText());
    addView(tv);
  }
}

Что-то такое.

person Jeffrey Blattman    schedule 12.04.2016
comment
Нет, я создаю интервалы для каждого отдельного слова. Мне просто нужен механизм, чтобы нажать на слово, затем заменить это слово вводом и получить введенное слово. - person Partho Mandal; 12.04.2016
comment
Да, см. выше. В Android нет ничего, что могло бы сделать это за вас. Вам нужно написать код самостоятельно. - person Jeffrey Blattman; 12.04.2016