GridView: использование RecyclerView или просто TextView с интерактивными словами

Итак, кто-нибудь знает, как создать следующую сетку? Мне нужно установить кликабельное событие для каждого слова:

рис 1

Если четыре слова не помещаются в строку, то должны быть показаны три строки:

если оно будет превышать строку n словами, то должно быть показано n слов в строке. Кто-нибудь знает, как это реализовать?

2 ответа

Вы можете использовать SpannableString и ClickableSpan. эта операция, например, создает TextView с вашим текстом и управляет кликами по каждому слову:

public class MainActivity extends AppCompatActivity {

    Activity activity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = this;
        TextView textView = (TextView) findViewById(R.id.textView);

        String text = "up down Antidisestablishment over took dropped lighten with from throught fell on up down Antidisestablishment over took dropped lighten with from throught fell on";

        String[] textArray = text.split(" ");

        SpannableString ss = new SpannableString(text);

        int start = 0;
        int end = 0;

        for(final String item : textArray){

            end = start + item.length();
            ClickableSpan clickableSpan = new ClickableSpan() {

                @Override
                public void onClick(View textView) {
                    Toast.makeText(activity, "Say " + item+ "!", Toast.LENGTH_SHORT).show();
                }
                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setUnderlineText(false);
                }
            };
            ss.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            start += item.length()+1;
        }
        textView.setText(ss);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setHighlightColor(Color.TRANSPARENT);

    }
}

а вот файл activity_main.xml:

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity"
    android:padding="5dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:textColor="#000000"
        android:textColorLink="#000000"/>

</LinearLayout>

если вы нажмете на любое слово, вы получите всплывающее окно с этим словом

РЕДАКТИРОВАТЬ: для выравнивания текста используйте библиотеку android-jusctedtextview

Но не библиотека из Gradle, есть старая версия, которая не поддерживает SpannableString, Я рекомендую просто скопировать класс JustifyTextView от мерзавца к вашему проекту. Тогда вы можете использовать этот вид в вашем .xml лайк:

<com.yourdomain.yourproject.JustifyTextView
  android:id="@+id/textView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textSize="24sp"
  android:textColor="#000000"
  android:textColorLink="#000000"/>

вот что я получил с этой библиотекой: обоснованный текст

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

Если количество элементов, которое вы должны добавить, мало, рассмотрите возможность использования FlowLayout. Это расширяет LinearLayout, так что просто оберните его в ScrollView, добавьте свои взгляды к нему динамически, и вы должны быть готовы.

Другие вопросы по тегам