4

Я хочу, чтобы реализовать пользовательские ViewGroup в моем случае, полученного из FrameLayout, но я хочу, чтобы все виды ребенка добавлены из XML, которые будут добавлены не непосредственно в этой точке зрения, но в FrameLayout, содержащихся в этом обычае ViewGroup. Позвольте мне показать пример, чтобы понять это.Android настраиваемое представление группы делегат addView

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
    <FrameLayout 
     android:id="@+id/frame_layout_child_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
    <FrameLayout 
     android:id="@+id/frame_layout_top" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</merge> 

И я хочу, чтобы перенаправить добавление все дочернее к FrameLayout с идентификатором frame_layout_child_container.

Так, конечно, я отменяю Методы addView() как этого

@Override 
    public void addView(View child) { 
     this.mFrameLayoutChildViewsContainer.addView(child); 
    } 

Но уверен, что это не работает, потому что за это время mFrameLayoutChildViewsContainer не добавляются в корне пользовательского вида.

Моя идея всегда держать некоторый взгляд на на вершине в этом контейнере frame_layout_top и все мнения ребенка добавлены в пользовательский компонент должен перейти к frame_layout_child_container

Пример использования настраиваемого представления

<CustomFrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello World!"/> 
    </CustomFrameLayout> 

Так что в этом регистр TextView должен быть добавлен в frame_layout_child_container

Возможно ли делегировать добавление всех видов в дочерний элемент ViewGroup, как я описал.

У меня есть другие идеи, как использование метода bringToFront(), каждый раз, когда добавляется представление, чтобы сохранить их в правильном порядке оси z или, например, при добавлении вида, сохранить его в массиве и после того, как после раздувания пользовательского представления добавьте все представления этому ребенку FrameLayout

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

+0

Вы действительно хотите расширить 'FrameLayout'? Атрибут 'orientation' работает только с' LinearLayout'. –

+0

Мне вообще не нужен атрибут ориентации :), так что я отвечаю да – CROSP

ответ

6

View s завышен из макета - как ваш пример TextView - не добавляется к их родителям ViewGroup с addView(View child), поэтому переопределением только что метод не работает для вас. Вы хотите переопределить addView(View child, int index, ViewGroup.LayoutParams params), в котором все остальные addView() перегружены в конечном итоге.

В этом методе проверьте, является ли добавленный ребенок одним из ваших двух специальных FrameLayout. Если это так, пусть класс super обрабатывает добавление. В противном случае добавьте ребенка в свой контейнер FrameLayout.

public class CustomFrameLayout extends FrameLayout { 

    private final FrameLayout topLayout; 
    private final FrameLayout containerLayout; 

    ... 

    public CustomFrameLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     LayoutInflater.from(context).inflate(R.layout.custom, this, true); 
     topLayout = (FrameLayout) findViewById(R.id.frame_layout_top); 
     containerLayout = (FrameLayout) findViewById(R.id.frame_layout_child_container); 
    } 

    @Override 
    public void addView(View child, int index, ViewGroup.LayoutParams params) { 
     final int id = child.getId(); 
     if (id == R.id.frame_layout_top || id == R.id.frame_layout_child_container) { 
      super.addView(child, index, params); 
     } 
     else { 
      containerLayout.addView(child, index, params); 
     } 
    } 
} 
+1

Отличная идея !!! Спасибо !! – CROSP

+0

Это отлично подойдет для меня. Одна вещь, которую я хочу добавить, однако, изначально представления, добавленные в мой дочерний контейнер LinearLayout, не были видны. Когда я использовал инспектор иерархии в Android Device Monitor, я заметил, что контейнер LinearLayout сам не был в представлении DOM. Короче говоря, это потому, что, как и в op, я использовал тег слияния, а не дополнительный LinearLayout. Когда вы это сделаете, ваш андроид: атрибут ориентации должен быть добавлен в ViewGroup, в который он сливается, а не сам тег слияния. Мои представления появились, как только я добавил это в файл макета другого родительского представления. – Breeno

+0

Также он может быть реализован путем проверки 'getChildCount() == 0'. – comm1x

Смежные вопросы