Android относится к пользовательским представлениям в цикле? - PullRequest
1 голос
/ 15 ноября 2010

Мне нужно рекурсивно перемещаться по нескольким моим собственным представлениям, расширяющим класс представления.

Например,

ViewOne.java
ViewTwo.java
ViewThree.java

Я создал экземпляры каждого представления в моем MainClass.java.

ViewOne vOne;
ViewTwo vTwo;
ViewThree vThree;

все эти представления реализуют функцию, называемую start().

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

for(int i=0; i<= 2:i++)
{
  views[i].start();
}

Как бы яидти делать это?

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

Итак, что требуется, так:

Нажмите Далее -> Добавить далеепросмотр -> удалить текущий вид.Нажмите Предыдущий -> добавить предыдущий вид -> удалить текущий вид.

например,

currView = 1

Current View is currView (1)
Click Next
Add View currView+1 (2) to Layout
Switch to View currView+1 (2)
Remove View currView (1)

or

currView = 2

Current View is currView (2)
Click Previous
Add View currView-1 (1) to Layout
Switch to currView-1 (1)
remove View currView (2)

Обратите внимание, что все эти представления имеют свой собственный уникальный тип и фактически являются отдельными классами, расширяющими представление.Я не могу просто типизировать их для «View», потому что это неправильно, их типами являются ViewOne, ViewTwo и ViewThree соответственно (например).

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Предполагая, что все представления были добавлены в макет, вы можете программно выполнять итерации по всем дочерним элементам в ViewGroup (т.е. макете) следующим образом:

ViewGroup group = findViewById(R.id.root); // The name of your layout
int children = group.getChildCount();
for (int i = 0; i < children; i++) {

    View child = group.getChildAt(i);
    if (child instanceof ViewOne) {        
       ... 
    } else if (child instanceof ViewTwo) {
       ...
    }
}

Кроме того, если все ваши пользовательские представления реализуют start(), я бы вставил этот метод в интерфейс, чтобы вы могли упростить блок if выше.

0 голосов
/ 15 ноября 2010

Поскольку вы пытаетесь отложить построение ваших представлений, я предлагаю вам использовать шаблон Builder.В соответствии с вашим примером создайте интерфейс Builder и получите три подкласса:

public class BuildViewOne implements Builder { 
    ... 
    public View start () { return new ViewOne (); }
}

public class BuildViewTwo implements Builder { 
    ... 
    public View start () { return new ViewTwo (); }
}

public class BuildViewThree implements Builder { 
    ... 
    public View start () { return new ViewThree (); }
}

Интерфейс Builder имеет метод запуска, который создает соответствующее представление, которое будет загружать эти ресурсы только при необходимости.Затем вы создаете свой массив конструкторов представлений следующим образом:

Builder builders[] = new Builder[] { 
    new BuildViewOne (), 
    new BuildViewTwo (), 
    new BuildViewThree ()
}

Теперь вы можете создать экземпляр класса через его индекс builders[2].start ().Основываясь на вашем вопросе, вы также можете кэшировать созданное представление с помощью компоновщика, чтобы позволить вам также реализовать метод stop (), который уничтожил бы представление.Таким образом, вы можете освободить ресурсы, когда удалите представление из своего макета (я предполагаю, что вам нужен один и только один экземпляр данного представления).

Примечание: выше не реальный код (т.е. я не компилировал и не запускал его).

0 голосов
/ 15 ноября 2010

Если вы хотите сделать это, я бы составил список представлений и цикл через этот список. Например:

List views = new ArrayList();
views.add(vOne);
views.add(vTwo);
views.add(vThree);

for (View view: views) {
view.start();
}
...