Как я могу выбрать несколько текстовых представлений с разными идентификаторами в Java Android Studio, например findViewById (R.id .)

#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, потому что он выдает ошибку при вставке его в сообщение.

https://github.com/lautarovculic/activity_medicina

Комментарии:

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. Готово!!! Большое спасибо! Было бы упущено, что когда я ищу другое слово, предыдущее выделенное слово удаляется и не различает прописные и строчные буквы, но это незначительная деталь, которая сейчас не является приоритетом, и это не относится к сообщению. Еще раз большое вам спасибо!!