#java #android #textview #android-edittext
#java #Android #textview #android-edittext
Вопрос:
Я делаю проект, и это частично имеет функцию поисковой системы, которая выделяет слова, которые ищутся.
У меня есть EditText и кнопка, которая при нажатии кнопки выделяет слово в EditText. Он отлично работает, если вы ищете его в одном TextView, поскольку я присваиваю ему findViewById(R.id.textView1), но что мне делать, если у меня более 100 TextView? Я делаю длинное руководство. Кроме того, каждое текстовое поле в XML имеет разные имена. Например, textView1, txView1, textView2, txVi1 и т. Д
Возможно ли то, что мне нужно сделать? Я искал во многих местах и ничего не мог найти.
Я оставляю вам часть кода .java
public class Medicina extends AppCompatActivity {
EditText searchview;
Button btnBuscar;
boolean isHighlight = false;
TextHighlighter textHighlighter;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_medicina);
searchview = (EditText)findViewById(R.id.searchview);
btnBuscar = (Button)findViewById(R.id.btnBuscar);
btnBuscar.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
if (!isHighlight){
textHighlighter = new TextHighlighter();
textHighlighter.setBackgroundColor(Color.parseColor("#FFFF00"))
.setBackgroundColor(Color.RED)
.addTarget()
.highlight(searchview.getText().toString(),TextHighlighter.BASE_MATCHER);
}
isHighlight = !isHighlight;
}
});
}
В .addTarget() будет использоваться findViewById (R.id.lalala)
И это сработало бы, если бы у вас был только один TextView, но это сотни.
Спасибо
Первые почти 300 строк XML-кода (отсюда все то же самое, подавляющее большинство TextView и ImageView). Я загружаю код на GitHub, потому что он выдает ошибку при вставке его в сообщение.
Комментарии:
1. Прикрепите xml
activity_medicina
с вашим вопросом.2. Первые почти 300 строк (в activity_medicina их более 3000, 90% — TextView) XML-кода (отсюда все то же самое, подавляющее большинство TextView и ImageView). Я загружаю код на GitHub, потому что он выдает ошибку при вставке его в сообщение. github.com/lautarovculic/activity_medicina
Ответ №1:
Вы можете назначить идентификатор для ViewGroup
, который содержит все TextView
. Затем получите ViewGroup
by findViewById(R.id.viewgroup)
и выполните цикл по всем ViewGroup
дочерним представлениям, чтобы получить все его TextView
.
public List<TextView> getAllTextViewsSimple() {
final List<TextView> result = new ArrayList<>();
final ViewGroup viewGroup = findViewById(R.id.viewgroup);
for (int i = 0; i < viewGroup.getChildCount(); i ) {
final View v = viewGroup.getChildAt(i);
if (v instanceof TextView) {
result.add((TextView) v);
}
}
return resu<
}
Если вам нужен еще более общий подход на случай TextView
, если они не могут быть размещены в одном и том же ViewGroup
. Присвоите идентификатор самому внешнему ViewGroup
, затем получите и передайте его в качестве параметра рекурсивной функции, чтобы получить все дочерние TextView
элементы.
public List<TextView> getAllTextViews(View v) {
final List<TextView> result = new ArrayList<>();
if (v instanceof ViewGroup) {
final ViewGroup viewGroup = (ViewGroup) v;
for (int i = 0; i < viewGroup.getChildCount(); i ) {
result.addAll(getAllTextViews(viewGroup.getChildAt(i)));
}
} else if (v instanceof TextView) {
result.add((TextView) v);
}
return resu<
}
Фрагмент кода, который поможет вам использовать его с TextHighlighter
final List<TextView> allTextViews = getAllTextViewsSimple();
textHighlighter.setBackgroundColor(Color.parseColor("#FFFF00"))
.setBackgroundColor(Color.RED);
for (TextView tv : allTextViews) {
textHighlighter.addTarget(tv);
}
textHighlighter.highlight(searchview.getText().toString(),TextHighlighter.BASE_MATCHER);
Комментарии:
1. Я пытаюсь узнать, куда поместить первый код, который вы мне передали, и как .java будет выглядеть тогда в части public TextHighlighter addTarget () { Я получаю сообщение об ошибке addTarget () говорит о пропущенном; imgur.com/f1Bya5n
2. Хорошо, я обновил свой ответ. Просто поместите метод
getAllTextViewsSimple
в свою активность (заonCreate
исключением тех случаев, когда я видел, что вы разместили предыдущий метод,onCreate
который был неправильным). ВызывайтеgetAllTextViewsSimple
всякий раз, когда вам нужно получить всеTextView
3. Я также добавил фрагмент кода, который поможет вам использовать его с
TextHighlighter
4. Готово!!! Большое спасибо! Было бы упущено, что когда я ищу другое слово, предыдущее выделенное слово удаляется и не различает прописные и строчные буквы, но это незначительная деталь, которая сейчас не является приоритетом, и это не относится к сообщению. Еще раз большое вам спасибо!!