У меня есть строка в андроиде:
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. Пожалуйста, помогите мне в этом. Спасибо.
woof
? - person T D Nguyen   schedule 12.04.2016