2015-09-03 2 views
3

У меня есть огромный макет для моей активности, который я установил с помощью setContentView(). В этом макете у меня есть TableLayout (с именем tableLayout в моей деятельности), который я хочу заполнить. Строки этого TableLayout являются customViews в файле макета (давайте назовем этот файл tablerow_layout.xml). Внутри этого макета у меня есть TextViews и ImageView. То, что я хочу сделать, это изменить содержимое TextView программно, когда я создаю строку. Это мой код:Как получить ссылку на представление из раздутого макета

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View newRow = layoutInflater.inflate(R.layout.tablerow_layout, null, false); 
TextView name = (TextView) newRow. findViewById(R.id.tablerow_name); 
name.setText("THIS LINE"); 
tableLayout.addView(newRow); 

К сожалению, при попытке изменить содержимое TextView мое приложение падает. Я знаю, что я мог бы сделать это с помощью ListView, но обычно у меня есть небольшое количество строк, и накладные расходы на создание другого адаптера для ListView превалируют большими.

Как @ ρяσѕρей K предложил я также попытался newRow.findViewById (...) вместо findViewById (...) без каких-либо различий

ответ

3

Как я могу получить ссылку на вид из надутого макета

Используйте View объект, который возвращается из LayoutInflater.inflate метода для доступа вида из макета, который передается в качестве первого параметра метода inflate.

В вашем случае, используйте newRow объект для доступа с видом R.layout.tablerow_layout макета:

TextView name = (TextView)newRow.findViewById(R.id.tablerow_name); 
+0

Пробовал это раньше и не имеет значения. Переход к редактированию моего вопроса – Felix

2

У вас не хватает, чтобы установить newRow в вашем TextView.

View newRow = layoutInflater.inflate(R.layout.tablerow_layout, null, false); 
    TextView name = (TextView)newRow.findViewById(R.id.tablerow_name); 
3
try 

    { 
    LayoutInflater layoutInflater = (LayoutInflater) 
    getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View newRow = layoutInflater.inflate(R.layout.tablerow_layout, null, false); 
    TextView name = (TextView) newRow.findViewById(R.id.tablerow_name); 

    name.setText("THIS LINE"); 

    tableLayout.addView(newRow); 

    }catch(Exception e) 

    { 

    e.printTracktrace(); 

    } 
+0

Это просто остановит мое приложение от сбоев, не устанавливая фактический текст. – Felix

1

Использование IntelliJ Amiya-х и ρяσѕρєя ответы Д.К. он работал для меня с этим кодом.

LayoutInflater inflater = LayoutInflater.from(this); 
    LinearLayout linearLayout = 
(LinearLayout)findViewById(R.id.profileView); 
    ViewGroup viewGroup = linearLayout; 

    for (int i = 0; i < NUM_OF_PROFILES; i++){ 

     LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.profile_badge_layout, viewGroup, false); 
     linearLayout.addView(layout); 

     TextView names = (TextView)layout.findViewById(R.id.profileName); 
     ImageView images = (ImageView)layout.findViewById(R.id.profileImage); 

     names.setText(""+i); 


     viewGroup = layout; 
    } 

Каждый текст имел свою ценность i. Я считаю, что вам нужно сначала добавить представление. Затем вы можете изменить значения