SanchelliosProg
@SanchelliosProg
Java, Android, Software Testing

Как доставать с помощью findViewById() программно сгенерированные элемнты UI?

Есть у меня Activity, в котором есть встроенный LinearLayout, в котором есть один editText-элемент по умолчанию, но пользователь кнопочкой может добавлять ещё editText-элементы. Как это сделано? А вот как:

private void addNewEditText(){
        if(getEditTextId() >= EDIT_TEXT_ID_LIMIT){
            //Часть кода пропущу, тут просто Toast который появляется, когда у нас слишком много
            //editText элементов
        }else {
            setEditTextId(getEditTextId()+1);

            EditText editText = new EditText(AddWordActivity.this);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );
            editText.setLayoutParams(params);
            editText.setSingleLine(true);
            editText.setId(getEditTextId());
            editViewsLayout.addView(editText);
        }
    }


setId() метод может добавлять только int значения в качестве id. И вот тут проблема.
Когда я хочу достать сгенерированный editText:
private void submitAllWords(){
        EditText et = (EditText)findViewById(R.id.editText_0);
        String word = et.getText().toString();
        Log.w("word to add: ", word + " from " + et.getId());
        insertNewWord(word, db);
        //TODO: Add here parsing words from the generated editTexts
        for(int i = 1; i <= EDIT_TEXT_ID_LIMIT; i++){
            et = (EditText)findViewById(i);
        }
    }

В одной из последних строк я пытаюсь достать элемент по int-айдишнику, но ругается Android-Studio, говорит:
Expected resource type id
и
Constant and resource type mismatching

В чём проблема? Как достать сгенерированные элементы по айдишнику?
  • Вопрос задан
  • 905 просмотров
Решения вопроса 1
@FoxInSox
@IdRes int i = 10;
findViewById(i);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gadfi
@gadfi
https://gamega.org
Во первых, я бы советовал все же не генерить EditText программно, а имплэйтить его из layout файла. Это не решит проблему c id, зато избавит вас от треша в коде, головной боли со сменой ориентации и принесет много других приятных плюшек )
что же касается решения с IdRes оно хорошее, но в ряде случаев и конкретно в данном (когда у нас есть контейнер) мне бы было его лениво использовать ─добавите вы еще десяток EditText, а может еще в вперемешку добавите два десятка кнопок и парочку картинок, чтобы не скучно было ) разбираться где чей id в таком случае не сложно, но лениво)

for (int i=0; i < editViewsLayout.getChildCount();  i++){
     EditText et = (EditText) editViewsLayout.getChildAt(i);
    // делаем что то с et
}

для того чтобы как то все же индетифицировать view, если надо, в ряде случаев удобно использовать setTag

оба способа стоит знать и использовать в зависимости то ситуации )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы