如何查找在textview Android上单击的单词

如何查找在textview Android上单击的单词,android,android-layout,textview,onclicklistener,Android,Android Layout,Textview,Onclicklistener,我有一个令牌列表,用户需要快速创建其中一个子集的列表。我现在有了键盘输入和列表显示,但键盘掩盖了列表。我的用户希望单击令牌,而不是键入它们。可能有500个令牌,因此listview似乎不可行。它们的长度可以从一个字符到20个字符不等,所以gridview似乎不是一个好主意。我所能想到的就是将列表保存在文本视图中,让用户单击其中一个,然后弹出一个警报,询问他是否想要输入该令牌。列表是可滚动的 基本上,我希望用户在textview中单击一个单词,让java知道这个单词是什么。所有单词都用逗号分隔 例

我有一个令牌列表,用户需要快速创建其中一个子集的列表。我现在有了键盘输入和列表显示,但键盘掩盖了列表。我的用户希望单击令牌,而不是键入它们。可能有500个令牌,因此listview似乎不可行。它们的长度可以从一个字符到20个字符不等,所以gridview似乎不是一个好主意。我所能想到的就是将列表保存在文本视图中,让用户单击其中一个,然后弹出一个警报,询问他是否想要输入该令牌。列表是可滚动的

基本上,我希望用户在textview中单击一个单词,让java知道这个单词是什么。所有单词都用逗号分隔

例如,这里有一个可能显示的集合

7月21日,5天,5岁,5岁,5岁,5岁,5岁,6岁,24岁,7岁,7岁,4岁,4岁,4岁,70岁,1岁,3岁,3岁,4岁,4岁,6岁,4岁,6岁,6岁,4岁,4岁,7岁,4岁,7岁,6岁,6岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,7岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁,4岁L,3T,7R,3K,2T,43,71,5N,1C,7H,5B,3M,6J,6M,6R,5H,1F,611K,4年,32、2、31、4Q,45、45、45、4、4、4、4、4、4、1、1、74、6、7、7、4、7、4、4、4、4、4、4、4、4、4、4、7、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、1、1、1、1、1、1、1、1、7、7、7、7、1、7、7、7、1、7、7、7、7、7、7、7、7、7、4、4、4、4、4、4、4、4、4、4、4、4、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、伯恩峡谷

用户需要能够在30秒内选择所需的10个项目(他在比赛开始前几分钟获得列表)

他需要输入的文本条目可能如下所示:

路线名称,30,24,4R,3E,6Q,3N,Thorn Knoll,5G

最好的方法是什么

这是我现在拥有的

他想要的是点击代币。

下面是一些文本代码来证明这个概念。感谢Vaghela M.R-移动设备开发者的链接

public class MainActivity extends Activity {
String waypoint = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
}
private void init() {
    String definition = "1A, 1B, 1C, 1D, 1E, 1F, 1G, 1H, 1J, 1K, 1L, 1M, 1N, 20, 21, 22, 24, 25, 26, 2A, 2B, 2C, 2F, 2H, 2J, 2K, 2R, 2T, 2X, 30, 31, 32, 33, 3A, 3B, 3C, 3D, 3E, 3F, 3G, 3H, 3J, 3K, 3L, 3M, 3N, 3P, 3Q, 3R, 3S, 3T, 3U, 3V, 3W, 3X, 3Y, 3Z, 40, 41, 42, 43, 44, 45, 46, 4A, 4B, 4C, 4D, 4E, 4F, 4G, 4H, 4J, 4K, 4L, 4M, 4N, 4P, 4Q, 4R, 4S, 4T, 4U, 4V, 4W, 4X, 4Y, 4Z, 5A, 5B, 5C, 5D, 5E, 5F, 5G, 5H, 5J, 5K, 5L, 5M, 5N, 5P, 5Q, 5R, 5S, 6A, 6B, 6C, 6D, 6E, 6F, 6G, 6H, 6J, 6K, 6L, 6M, 6N, 6P, 6Q, 6R, 6S, 70, 71, 72, 73, 74, 7A, 7B, 7C, 7D, 7E, 7F, 7G, 7H, 7J, 7K, 7L, 7M, 7N, 7P, 7Q, 7R, 7S, 7T, 7U, 7V, 7W, 7X, 7Y, 7Z, Black_Jack, Bourne_Gap, Calshot_Spit, Castle_Point, Hook, North_Thorn, Thorn_Knoll".trim();
    TextView definitionView = (TextView) findViewById(R.id.text);
    definitionView.setMovementMethod(LinkMovementMethod.getInstance());
    definitionView.setText(definition, BufferType.SPANNABLE);
    Spannable spans = (Spannable) definitionView.getText();
    BreakIterator iterator = BreakIterator.getWordInstance(Locale.US);
    iterator.setText(definition);
    int start = iterator.first();
    for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator
            .next()) {
        String possibleWord = definition.substring(start, end);
        if (Character.isLetterOrDigit(possibleWord.charAt(0))) 
        {
            ClickableSpan clickSpan = getClickableSpan(possibleWord);
            spans.setSpan(clickSpan, start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
}
private ClickableSpan getClickableSpan(final String word) {
    return new ClickableSpan() {
        final String mWord;
        {
            mWord = word;
        }
        @Override
        public void onClick(View widget) {
            TextView textView1 = (TextView) findViewById(R.id.textView1);
            Log.d("tapped on:", mWord);
            Toast.makeText(widget.getContext(), mWord, Toast.LENGTH_SHORT)
                    .show();
            checkWord(mWord);
        }
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
        }
    };
}
public void doSomething(){
    TextView textView1 = (TextView) findViewById(R.id.textView1);
    StringBuilder sb = new StringBuilder();
    sb.append(textView1.getText());
    sb.append(", ").append(waypoint);
    textView1.setText(sb);
}
public void checkWord(String word) {
    waypoint = word;
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Enter "+ word + "?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    // fire an intent go to your next activity
                   doSomething();
               }
           })
           .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}
}

感谢@VaghelaM.R-MobileDevloper的链接,这是一个很好的答案,现在在我的应用程序中运行。有人在上面加了一个标题,说之前已经回答过了,这是浪费时间@VaghelaM.R-MobileDeloper的链接有答案,我编辑了这个问题以反映我所做的。他实际上并没有给出答案,所以我不能正式信任他。只需阅读扩展问题并找到工作代码。

可能与我在发布之前看到的线程重复。该方法似乎不适用于非编辑文本视图,因为此列表无法编辑。文档中说“对于非EditText文本视图,这经常是空的”,因为我正在使用android level 11,这也让我感到厌烦。该方法有效吗?如果help full to you@VaghelaM.R-MobileDevloper,请参阅此链接。我已经运行了一个快速测试,我认为该方法有效。非常感谢。它也使用最小API 8,字段是文本视图,而不是编辑文本。都是好事。我只需要在它周围添加一些绒毛并将其整合。效果很好。我将用于测试的代码放在上面的问题中。再次感谢@VaghelaM.R-MobileDevloper