2016-04-11 11 views
0

Ich habe eine Zeichenfolge in android:Wie man anklickbares Wort mit TextWatcher in EditText in android verbindet?

String meow = "this_is_part1_and_here_another_and_another_one"; 

ich jedes Wort klickbare mit Clickable Spanne gemacht.

Es folgt der Code für für jedes Wort klickbare Spanne Implementierung (angepasst von einem Stack-Überlauf Antworten)

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 
    } 

} 

Wenn ich ein bestimmtes Wort tippen, zeige ich einen Toast des Wortes. Nun, was ich will ist, wenn ich dieses spezielle Wort anklicke, nachdem ich dieses Wort für ein paar Sekunden gezeigt habe, wird dieses Wort in EditText leer, und ich tippe ein neues Wort an seine Stelle und erhalte diese bestimmte Zeichenfolge.

this_is_part1_and_here_another_and_another_one

ich auf Wort part1 tippen:

Z. B Folgendes ist in EditText gezeigt. Nach zeigt part1 in Toast für ein paar Sekunden, wird das Wort leer in EditText wie folgt aus:

this_is_ _and_here_another_and_another_one

Jetzt tippe ich ein neues Wort an seiner Stelle sagen woof

this_is_woof_and_here_another_and_another_one

An d Ich kann das Wort woof in einer Zeichenfolge speichern.

Wie geht das? Kurz gesagt, wie kann ich meine anklickbaren Wörter mit TextWatcher verknüpfen? Ich habe den TextWatcher-Teil kommentiert, da ich nicht weiß, wie er ClickableSpan zuordnen kann. Bitte hilf mir dabei. Vielen Dank.

+0

Welche Zeichenfolge zum Speichern des Wortes 'woof'? –

+0

Es ist nur ein Beispiel. Ich möchte alle vorherigen anklickbaren Wörter und alle bearbeiteten Wörter in diesem Wort in einer Karte/Multimap speichern –

Antwort

0

Ich glaube nicht, dass Sie verschiedene Wörter in einem Bereich "verknüpfen" können. Sie erhalten nur die Textansicht beim Klick-Listener. Ich würde vorschlagen, dass Sie eine ViewGroup bauen, die ein oder mehrere Wörter verkapselt und auf einzelne Wort Klicks reagieren können,

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); 
    } 
} 

So ähnlich.

+0

Nein, ich erstelle Spannen für jedes einzelne Wort. Ich brauche nur einen Mechanismus, um auf ein Wort zu tippen, dann ersetze ich dieses Wort, indem ich das eingegebene Wort eintippe und abrufe. –

+0

Ja, siehe oben. Es gibt nichts in Android, das das für Sie tun wird. Sie müssen den Code selbst schreiben. –