Как я могу повторно использовать ViewGroup, определенную в файле XML, несколько раз в Android? - PullRequest
1 голос
/ 05 января 2011

Я пытаюсь создать простую игру.Я хотел бы заполнить LinearLayout, который я определил в XML, несколькими RelativeLayout.Каждый раз, когда пользователь нажимает кнопку, я бы хотел, чтобы дочерний вид был добавлен в LinearLayout.Каждый RelativeLayout будет немного меняться в зависимости от ввода пользователя (какие кнопки были нажаты и т. Д.).

Я хочу создать новый RelativeLayout на основе файла макета XML.Затем я хочу манипулировать некоторыми атрибутами дочерних представлений RelativeLayout (в частности, src некоторых ImageViews) и добавить его в LinearLayout.Само по себе это не особенно сложно.Я могу добраться до каждого из потомков RelativeLayout, используя findViewById, но у меня возникают проблемы, когда я хочу создать n чисел RelativeLayout на основе одного и того же XML.Я почти уверен, что повторяющиеся идентификаторы вызывают сбои.Может ли RelativeLayout работать без использования идентификаторов?Должен ли я попытаться найти другой способ построения интерфейса с использованием разных ViewGroups?

Я не уверен, что то, что я спрашиваю, возможно даже, но я знаю, что создание этих элементов на лету с использованием кодаАльтернативой XML-макетам является ужасная мысль.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 05 января 2011

РЕДАКТИРОВАТЬ: я потерял ход мыслей на полпути, предыдущий пример имел некоторые ошибки.Я обновил.

pedr0 имеет правильную идею, но, чтобы уточнить, вы могли бы попробовать что-то на этот счет (при условии, что у вас есть RelativeLayout, определенный в относительном.Это не проверено, но общая идея должна быть действительной.Вам даже не нужно делать отдельный метод, вы можете сделать это встроенным в обработчике кликов, или как угодно, но я только что сделал метод addChildView для примера:

LayoutInflater inflater;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //get the LinearLayout that you plan to add rows to
    LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linear_layout);

    //get the LayoutInflater from the system
    inflater = getSystemService(LAYOUT_INFLATER_SERVICE);

    //call getNewChildView with whatever drawable id you want to place
    //as the source. If you want to pass in other types, just change
    //the parameters (e.g. Drawable, Bitmap)
    linearLayout.addView(getNewChildView(R.drawable.my_image));
}

public RelativeLayout getNewChildView(int resId) {
    //inflates a copy of your RelativeLayout template
    RelativeLayout rl =  (RelativeLayout)inflater.inflate(R.layout.relative, null);

    //this assumes an ImageView in your RelativeLayout with an id of image
    ImageView img = (ImageView)rl.findViewById(R.id.image);
    img.setBackgroundResource(resId);

    return rl;
}
1 голос
/ 06 января 2011

РЕДАКТИРОВАТЬ: я даже не мог понять, как правильно использовать теги кода вздох

Спасибо вам обоим за ваши быстрые ответы. Я имел в виду нечто очень похожее, и фактически был на том же треке и использовал LayoutInflator. Я немного упростил ваш пример, поскольку мне не нужно передавать идентификатор рисованного элемента.

LayoutInflater inflater;

private void drawGuess() {
    // The top level LinearLayout to add to
    LinearLayout topLevel = (LinearLayout) findViewById(R.id.guessList);

    // get the inflater`
    inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    // add the view (based on stored data elsewhere)
    topLevel.addView(getLatestGuess());
}

private RelativeLayout getLatestGuess() {
    //inflates a copy of your RelativeLayout template
    RelativeLayout rl =  (RelativeLayout)inflater.inflate(R.layout.guess_layout, null);

    //this assumes an ImageView in your RelativeLayout with an id of image
    ImageView guessOne = (ImageView)rl.findViewById(R.id.guess1);
    guessOne.setImageResource(R.drawable.red);
}

Запуск этого кода работает, подвох в том, что он работает только при первом вызове. При втором вызове getLatestGuess () происходит сбой. Удаление идентификаторов в XML (например, предположения 1) из всех дочерних представлений RelativeLayout больше не приводит к сбою. К сожалению, теперь у меня есть довольно бесполезный RelativeLayout, который я больше не могу получить в дочерних представлениях, поскольку у них нет идентификаторов. Предположительно, идентификаторы должны быть уникальными.

0 голосов
/ 05 января 2011

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

Примерно так:

RelatoveLayout root = ....;

RelativeLayouttoadd = inflate (ваш XML);

применяется путем изменения кода в зависимости от ввода пользователя, например:

toadd.setBackgroundResource (....);

и, наконец,добавить результат в корень:

root.addView (toadd).

Я очень надеюсь вам помочь!

Пока!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...