2013-03-01 2 views
0

У меня есть это Деятельность B с textview. Строка, которая будет отображаться в textview, поступает из моего предыдущего Деятельность A (результат запроса, который содержит более одной записи/Passed thru Bundle)андроид textview clickable words

Мой вопрос: как вы можете сделать каждую запись кликабельной? Обратите внимание, что в моей работе B у меня есть только одно текстовое представление для строки от Деятельность A. Я хочу, чтобы каждое слово было кликабельным, а затем оно переходило к его соответствующей деятельности.

FYI, Это выбранный

enter image description here

ОБНОВЛЕНО:

Result.class

 @Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.symptomsresult); 

    result = (TextView) findViewById (R.id.tvSymptomResult); 

    Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      String value = extras.getString("results"); 
      result.setText(value); 
      } 
      else{ 

      } 

} 

Symptoms.class

String[] symptoms = alSymptoms.toArray(new String[alSymptoms.size()]); 

     String c = dbHelper.getData(symptoms); 

     final int result = 1; 
     Bundle extras = new Bundle(); 
     Intent i = new Intent(this, SymptomsResult.class); 
     extras.putString("results", c); 
     i.putExtras(extras); 
     startActivityForResult(i, result); 

DBHelper.class

 public String getData(String[] symptoms) { 
    String where = KEY_SYMPTOMS + "= ?"; 
    String orStr = " OR "; /* Maybe " AND "? */ 

    StringBuilder builder = new StringBuilder(where); 
    for(int i = 1; i < symptoms.length; i++) 
     builder.append(orStr).append(where); 

    String search = ""; 
    Cursor c = myDataBase.query(true, DB_TABLE, new String[] 
      {KEY_CONDITIONS}, builder.toString(), symptoms, null, null, null, null); 

    c.moveToFirst(); 

    while (c.isAfterLast() == false) { 
     search += c.getString(0) + ", "; 
     c.moveToNext(); 
    } 

    return search; 

} 


Любая помощь приветствуется. Благодаря!

+1

используйте listview вместо textview. Каждая строка списка может содержать слова. По щелчку откройте соответствующую операцию. – Raghunandan

+0

@ Raghunandan yup Я рассматриваю использование listview, пожалуйста, посмотрите мой обновленный пост, где я включил свои коды. –

+0

Хранить все результаты в архаристе string (в youractivity A) и предоставить адаптер listview с данными arraylist. – Raghunandan

ответ

2

Вы можете сделать это с помощью класса Linkify и Spannables.Но я считаю, что ListView - лучший выбор, элементы легче нажимать, потому что они больше, и этот подход имеет гораздо больше документации.

Вы все еще можете использовать код, который я написал в getData(), но вместо того, чтобы перевернуть курсор в строку, передать курсор в SimpleCursorAdapter.


Так как я положил их в ListView?

Изменить getData() следующим образом:

public Cursor getData(String[] symptoms) { 
    String where = KEY_SYMPTOMS + "= ?"; 
    String orStr = " OR "; /* Maybe " AND "? */ 

    StringBuilder builder = new StringBuilder(where); 
    for(int i = 1; i < symptoms.length; i++) 
     builder.append(orStr).append(where); 

    return myDataBase.query(true, DB_TABLE, new String[] 
      {"rowid as _id", KEY_CONDITIONS}, builder.toString(), symptoms, null, null, null, null); 
} 

Затем передайте этот курсор к CursorAdapter и привязать его к ListView:

String[] fromColumns = {DBAdapter.KEY_CONDITIONS}; 
int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1 

setListAdapter(new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, getData(symptoms), 
     fromColumns, toViews, 0)); 

(я сделал несколько предположений здесь, но это как связать курсор с ListActivity.)

+0

Если я понял вас хорошо, последний код должен быть помещен в мою деятельность A или B? –

+0

Это должно быть Activity B. – Sam

+0

Одна вещь, переменная симптомов не объявлена ​​в моей деятельности B. Так как я могу передать симптомы из Activity A в B? –

1

Вы можете использовать HTML href в качестве значения текста, а затем добавить эту строку, чтобы сделать вид, как веб-ссылка

txtView.setMovementMethod(LinkMovementMethod.getInstance()); 

Вы можете открыть вашу деятельность на мыши, делая ссылку с обычаем scheme

Пример кода:

txtView.setText(Html.fromHtml(String.format("<a href='%s://%s'>%s</a>", 
                  schema,action,text))); 

И для деятельности, которую вы хотите открыть при нажатии на эту ссылку, вы должны добавить followin г в manifest

<intent-filter> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <action android:name="android.intent.action.VIEW" /> 
    <data 
     android:host = "YOUR_ACTION" 
     anroid:scheme="YOUR_SCHEME" /> 
</intent-filter> 

Хитрость здесь, что вы создаете свой собственный URL и вместо host у вас есть действие, которое может быть установлено для запуска различных видов деятельности. Обратите внимание, что action/host и scheme может быть любая произвольная строка, если они совпадают со значениями, которые вы используете при создании ссылки

Итак, когда вы нажмете, что текст такой ссылки будет вызывать активность, которая соответствует scheme/host

I Я использую это решение в очень похожем случае с вашим, и он работает отлично.

+0

Извините, но я не собираюсь ссылаться на веб-страницу. –

+0

Нет проблем, я использую то же самое для ссылки на «активность», просто вам нужна активность, чтобы прослушать конкретную «схему» – iTech

+0

. Я добавил в свой ответ более подробные сведения, чтобы показать вам, как вы можете реализовать полное решение, то есть открыть определенную деятельность при нажатии ссылки в TextView. – iTech