2016-08-31 3 views
0

У меня есть пользовательский , в котором в каждом списке присутствуют разные кнопки. моя цель состоит в том, чтобы сделать единое представление текстовогоИзменить TextView на интерактивные слова в пользовательском ListView

<TextView 
    android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#000000" 
    android:text="Example" 
    android:textSize="16dp" 
    android:layout_below="@+id/rl1" /> 

, чтобы быть изменение в соответствии с Предложением, так что каждое слово кликабельно От enter image description here
К этому enter image description here
и слов должны быть передано на функцию.

Я думаю, что если мы сможем разделить один TextView на несколько TextView и сделать их интерактивными, это возможное решение NON XML?
Любой фрагмент кода будет благодарны
С уважением

+0

применить подстроку по методу onClick и использовать эту подстроку. –

+0

взгляните на [spannableString] (https://developer.android.com/reference/android/text/SpannableString.html), [this] (http://stackoverflow.com/questions/25363310/clickable-words- in-of-textview-android) ответ может помочь вам – Signo

+0

Какую цель?Что должно произойти при нажатии на слово? – ElefantPhace

ответ

1

Вашим вопрос требует глубокого использования SpannableString, Androider уже дал хороший совет для решения вашей проблемы, но вы сказали, что динамически получаете слова из базы данных, поэтому здесь я написал код для вас, который будет обрабатывать динамический контент. Я не проверял это, надеюсь, он должен сработать для вас.

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    ListView lv ; 
    public static String [] prgmNameList={"Android Dev","SpearHead Inc"}; // You can put dynamic strings in this array . 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     lv=(ListView) findViewById(R.id.listView); 
     lv.setAdapter(new CustomAdapter(this, prgmNameList)); 

    } 


} 

CustomAdapter:

public class CustomAdapter extends BaseAdapter { 
    String [] result; 
    Context context; 
    private static LayoutInflater inflater=null; 
    public CustomAdapter(MainActivity activity, String[] prgmNameList) { 

     result = prgmNameList; 
     context = activity; 
     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() { 
     return result.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public class Holder 
    { 
     TextView tv; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     Holder holder=new Holder(); 
     View rowView = inflater.inflate(R.layout.list_item, null); 
     holder.tv=(TextView) rowView.findViewById(R.id.textView1); 
     //holder.tv.setText(result[position]); 

     String span[] = result[position].split(" ") ; 

     SpannableString ss = new SpannableString(result[position]); 

     ClickableSpan spans[] = new ClickableSpan[span.length]; 

     for(int spanCount = 0 ; spanCount < span.length ; spanCount++){ 
      spans[spanCount] = new ClickableSpan() { 
       @Override 
       public void onClick(View textView) { 

        TextView v = (TextView)textView ; 
        String text = v.getText().toString() ; 

        Log.d("View" , text); 
       } 
      }; 
     } 

     int start = 0 ; 
     int end ; 
     try { 
      for(int spanCount = 0 ; spanCount < span.length ; spanCount++){ 
       end = span[spanCount].length()-1 ; 
       ss.setSpan(spans[spanCount], start, end , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
       start = span[spanCount].length()+1; 
       end = span[spanCount].length() + 2 + end ; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     holder.tv.setText(ss); 

     Log.d("SpannableString" , ss.toString()); 

     return rowView; 
    } 

} 

list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_gravity="center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="25dp" 

     android:text="Hello World" /> 

</LinearLayout> 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.shishupalshakya.spannablestringsample.MainActivity"> 

    <ListView 
     android:id="@+id/listView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </ListView> 


</RelativeLayout> 

Наполните код в своем приложении и запустите.

+0

кажется хорошим кодом для динамического контента. –

+0

Я могу преобразовать строку в spannable в свой список, но они не отвечают на клик или касание в журнале – phpdroid

+0

http://stackoverflow.com/questions/39313679/spannable-string-not-clickable-in-a-custom- Посмотреть список – phpdroid

3

Пожалуйста, попробуйте этот код, потому что вам нужно Spannable строку:

 SpannableString ss = new SpannableString("Hello World"); 
     ClickableSpan span1 = new ClickableSpan() { 
      @Override 
      public void onClick(View textView) { 
       // do first word click work 
      } 
     }; 

     ClickableSpan span2 = new ClickableSpan() { 
      @Override 
      public void onClick(View textView) { 
       // do second word click work 
      } 
     }; 

     ss.setSpan(span1, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     ss.setSpan(span2, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

     TextView textView = (TextView) findViewById(R.id.hello); 
     textView.setText(ss); 
     textView.setMovementMethod(LinkMovementMethod.getInstance()); 

Благодаря

+0

мои слова динамичны из базы данных не первое или второе слова – phpdroid

+0

Это всего лишь пример, это ваша задача выяснить, как это использовать динамически – ElefantPhace

+0

@ElefantPhace. Я проверил этот код в своих исследованиях перед публикацией этих вопросов. это не тесно связано с работой над пользовательским ListView – phpdroid

0

Я сделал простой пример, который satifes ваши требования

SpannableString text = new SpannableString("Text with Clickable word"); 

// make "Clickable" (characters 10 to 18) display a toast message when touched 
final Context context = this; 
ClickableSpan clickableSpan = new ClickableSpan() { 
    @Override 
    public void onClick(View view) { 
     Toast.makeText(context, "Clicked!!!", Toast.LENGTH_LONG).show(); 
    } 
}; 
text.setSpan(clickableSpan, 10, 18, 0); 

Согласно ваш обновленный ответ

  1. Вы можете использовать содержит метод на строку, чтобы выяснить, является ли ваши DB`s слова присутствуют или нет в доступной строке
  2. , то вы можете использовать IndexOf, чтобы получить их индекс в доступной строке
  3. у вас уже есть длина слова

так что вы можете сделать этот процесс динамического легко

+0

У вас есть тост, если слово не нажимает, какое слово нажата? – phpdroid

+0

для 1. не имеет значения, если присутствует. Мне просто нужно перейти к новой деятельности. – phpdroid

+0

http://stackoverflow.com/a/19750721/5109213 проверить это, чтобы получить нажатое слово –

Смежные вопросы