0

I have a list of tokens and the user needs to create a list of a subset of these quickly. I now have keyboard entry and a display of the list but the keyboard covers up the list. My user wants to click on the tokens rather than type them in. There might be 500 tokens so a listview seems unworkable. They can be different lengths from one character to 20 so a gridview doesn't seem like a good idea. All I can think of is to keep the list in a textview and have the user click on one and pop up a alert asking if he wants to enter that token. The list is scrollable.

Basically, I want the user to click on a word in a textview and have the java know what word that was. All words are separated by commas.

For example, here is one set that might be displayed

7W, 4F, 2R, 5K, 73, 3J, 6F, 2F, 7M, 21, 5D, 1H, 5C, 24, 7Y, 4D, 70, 1E, 3P, 2C, 4B, 3E, 5A, 4G, 5E, 6H, 6N, 7J, 7S, 2B, 41, 4H, 3H, 2A, 3B, 3F, 40, 4N, 2J, 3C, 22, 5M, 44, 7Z, 3U, 3L, 3Q, 7A, 72, 4V, 7X, 26, 1D, 4M, 6D, 5R, 6B, 6K, 7U, 7V, 7T, 7P, 7L, 4R, 7G, 7E, 7B, 3X, 7F, 5J, 5L, 3T, 7R, 3K, 2T, 43, 71, 5N, 1C, 7H, 5B, 3M, 6J, 6M, 6R, 5H, 1F, 1L, 7Q, 6P, 7C, 6A, 4T, 3R, 46, 1N, 1K, 4Y, 5F, 7K, 6S, 5Q, 2H, 42, 4X, 1A, 1B, 33, 3N, 2K, 3G, 4A, 5G, 30, 4E, 7N, 4S, 3S, 5S, 3D, 20, 4K, 1J, 32, 2X, 31, 4Q, 45, 4Z, 1G, 74, 6G, 4C, 4U, 3Z, 4W, 5P, 25, 1M, 6C, 3V, 3Y, 3A, 6E, 4P, 7D, 4J, 4L, 3W, 6L, 6Q, Thorn Knoll, North Thorn, Hook, Black Jack, Castle Point, Calshot Spit, Bourne Gap,

The user needs to be able to select the desired 10 items in under 30 seconds (he gets the list just a few minutes before the start of a race).

The text entry that he needs to enter might look like this:

Route Name, 30,24,4R, 3E, 6Q, 3N, Thorn Knoll, 5G

What is the best way to do this?

Here is what I have now enter image description here

What he wants is to just click on the tokens. enter image description here

Here is some text code to prove the concept. Thanks to Vaghela M.R - Mobile Devloper for the link.

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();
}
}
canova
  • 3,965
  • 2
  • 22
  • 39
Allen Edwards
  • 1,488
  • 1
  • 27
  • 44
  • possible duplicate of [Determining which word is clicked in an android textview](http://stackoverflow.com/questions/11601139/determining-which-word-is-clicked-in-an-android-textview) – Embattled Swag Feb 14 '14 at 19:21
  • I had seen that thread before posting. It looked like the method would not work with a non edit textView as this list cannot be editable. The documentation says "This will frequently be null for non-EditText TextViews" As I am working on android level 11 that threw me off as well. Will that method work? – Allen Edwards Feb 14 '14 at 19:36
  • refer this link if help full to you http://stackoverflow.com/questions/8612652/select-a-word-on-a-tap-in-textview-edittext – Android Leo Feb 14 '14 at 20:50
  • @VaghelaM.R-MobileDevloper I have run a quick test and I think that will work. Thank you! It is working with minimum API 8 as well and the field is a TextView, not an Edit Text. All good things. I just need to add some fluff around it and integrate it. – Allen Edwards Feb 14 '14 at 23:03
  • Works great. I put the code I used for the test in the problem above. Thanks again @VaghelaM.R-MobileDevloper – Allen Edwards Feb 15 '14 at 00:32

1 Answers1

0

Thanks to @VaghelaM.R-MobileDevloper for the link this is a nice answer that is now working in my app. The header someone put on this about it having been previously answered is a waste of time. @VaghelaM.R-MobileDevloper's link had the answer and I edited the question to reflect what I did. He did not actually post an answer so I cannot credit him formally. Just read the expanded question and find the working code.

Allen Edwards
  • 1,488
  • 1
  • 27
  • 44