У меня есть несколько линейных макетов, как я могу изменить некоторые или все фоны за один раз, затем изменить их снова, снова и т. Д.? - PullRequest
0 голосов
/ 18 июня 2011

В моей деятельности у меня есть около 40 линейных макетов ... В основном 5 родителей и остальные дети этих родителей.

Что я хочу сделать, это изменить фон некоторых из них, затем нажатькнопка и изменить фон других.

Проблема, с которой я столкнулся ... И, к сожалению, у меня нет точного кода, который я имею сейчас, заключается в том, что, как только я изменяю фон, я должен установитьэто к нулю.

Код, который я имею в своем классе Java, выглядит примерно так ...

mlayout1= findViewById(R.id.layout1);

mlayout2= findViewById(R.id.layout2);

mlayout3= findViewById(R.id.layout3);

mlayout4= findViewById(R.id.layout3);

if variable = 1{

mlayout1.setBackgroundResource(R.drawable.background_img);
mlayout2.setBackgroundResource(R.drawable.background_img);
mlayout3.setBackgroundResource(R.drawable.background_img);
mlayout4.setBackgroundResource(R.drawable.background_img);
}

if variable = 2{

mlayout1.setBackgroundResource(R.drawable.background_img);

mlayout2.setBackgroundResource(null);

mlayout3.setBackgroundResource(R.drawable.background_img);

mlayout4.setBackgroundResource(null);
}

if variable = 3{

mlayout1.setBackgroundResource(R.drawable.background_img);

mlayout2.setBackgroundResource(null);

mlayout3.setBackgroundResource(null);

mlayout4.setBackgroundResource(null);
}

и т. д. *

Одна проблема заключается в том, чтоЕсть около 30 макетов, которые мне нужны, чтобы изменить фон, и около 500 различных комбинаций, с которыми я работаю ...

Самая большая проблема, с которой я сталкиваюсь, - это переустанавливать все фоны.обнулить до применения новой комбинации фонов ...

У меня есть таблица со всеми различными комбинациями в ней.

Я хотел бы иметь возможность прокручивать их, нажимая следующуюи / или предыдущая кнопкаили введите идентификационный номер комбинации и включите правильную комбинацию фона, а затем сбросьте их все, прежде чем загорится следующая комбинация ......

Может быть, мне нужно другое действие, чтобы сбросить все до нуляпрежде чем рисовать новую комбинацию фонов или чего-то еще, я не уверен, как лучше это сделать эффективно.

Я новичок в Android, и у меня болит голова, когда я пытался понять это в течение нескольких недельсейчас ...

1 Ответ

1 голос
/ 18 июня 2011

Первое, что вы, возможно, захотите сделать, это поместить ваши макеты в массив, список или что-то еще, чтобы вам не приходилось кодировать имя 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, описанный выше, чтобы изменить фон при необходимости.

...