GridView: использование RecyclerView или просто TextView с интерактивными словами
Итак, кто-нибудь знает, как создать следующую сетку? Мне нужно установить кликабельное событие для каждого слова:
Если четыре слова не помещаются в строку, то должны быть показаны три строки:
если оно будет превышать строку 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
, добавьте свои взгляды к нему динамически, и вы должны быть готовы.