Первое, что вы, возможно, захотите сделать, это поместить ваши макеты в массив, список или что-то еще, чтобы вам не приходилось кодировать имя ID каждого из них:
public void onCreate(Bundle b) {
setContentView(R.layout.main);
List<View> myViews = new ArrayList<View>();
myViews.add(findViewById(R.id.layout1));
myViews.add(findViewById(R.id.layout2));
// etc.
}
Затем вы можете обращаться к ним напрямую и программно в массиве. Но это все еще много кода.
Если у вас есть доступ к их родителям, вы можете выбирать их потомков при выборе:
public void performSelection(int selection) {
// One of your parents that holds a lot of child views
ViewGroup parent = (ViewGroup)findViewById(R.id.parent_1);
for(int i = 0; i < parent.getChildCount(); i++) {
View v = parent.getChildAt(i);
// If selection is 1, this sets the drawable background on every item.
// If 2, then sets drawable on 0, 2, 4, 6, ... and null on 1, 3, 5, ...
// If 3, then sets drawable on 0, 3, 6, 9, ... and null on 1, 2, 4, 5, ...
if (i % selection == 0) {
v.setBackgroundResource(R.drawable.background_img);
} else {
v.setBackgroundResource(null);
}
}
}
Осторожно, это будет смотреть на КАЖДОГО ребенка для запрошенного родителя. Убедитесь, что он содержит только те виды, для которых вы хотите изменить фон.
Другой подход: если все ваши представления макета в основном одинаковы в XML, но с разными идентификаторами, вы можете рассмотреть возможность создания отдельного ресурса XML для одного и последующей их динамической загрузки при создании активности в ваших родителей или массив. В этом случае ваш XML-файл основного макета будет иметь элемент parent_1, но без дочерних представлений, так как они будут добавлены во время выполнения.
layout/one_element.xml
:
<LinearLayout ...>
<TextView android:id="@+id/element_text" ... />
<!-- etc -->
</LinearLayout>
Тогда вы можете сделать что-то вроде этого:
public void onCreate(Bundle b) {
setContentView(R.layout.main);
// One of your parents that will hold a lot of child views
ViewGroup parent = (ViewGroup)findViewById(R.id.parent_1);
for (int i = 0; i < NUM_CHILDREN; i++) {
View newView = getLayoutInflater().inflate(R.layout.one_element,
null);
// Set anything specific to the new view
// eg.
TextView tv = (TextView)newView.findViewById(R.id.element_text);
tv.setText(String.format("Hi, I'm element %d!", i));
// Add it to the parent
parent.addView(newView);
}
}
Затем вы можете использовать метод performSelection
, описанный выше, чтобы изменить фон при необходимости.