Пользовательская группа просмотра работает внутри LinearLayout, а не RelativeLayout - PullRequest
0 голосов
/ 04 октября 2011

Я хотел создать пользовательский LinearLayout (а затем и пользовательский ImageButton), который мог бы принимать процентные значения для обоих измерений размера на основе размера его родителя независимо от родительского типа (относительный или линейный).Я следил за этим сообщением: Как измерить представление Android на основе размеров его родителя , и это было очень полезно, но у меня есть проблема, что эти ответы не решаются.

КогдаЯ размещаю свой Custom LinearLayout внутри другого LinearLayout, все работает как положено.Мой пользовательский LinearLayout покрывает ожидаемое пространство (80% ширины родительского элемента в приведенном ниже примере).

Однако, если я помещаю его в RelativeLayout, мой экран всегда отображается пустым, я не уверен, почему это происходит.

Вот мой класс:

public class ButtonPanel extends LinearLayout {

    public ButtonPanel(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        int newWidth = (int) Math.ceil(parentWidth * 0.8);

        this.setMeasuredDimension(newWidth, parentHeight);
        this.setLayoutParams(new RelativeLayout.LayoutParams(newWidth,parentHeight));

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

А вот мой макет тестирования для действия.

<RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">

        <com.android.tests.views.ButtonPanel
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@drawable/inner_panel"
                android:gravity="center_horizontal"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true">
        </com.android.tests.views.ButtonPanel>
    </RelativeLayout>

В своей деятельности все, что я делаю, это настраиваю представление контента наприведенный выше макет.

(Кстати, кто-нибудь теперь знает, как я могу динамически получить тип родительского элемента для установки новых параметров LayoutParameters? Выше вы увидите родительский тип (RelativeLayout), жестко запрограммированный в пользовательском представлении.Функция onMeasure)

Заранее спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

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

this.getParent().getClass().getName()

Это также должно работать

a instanceof B

или

B.class.isAssignableFrom(a.getClass())

При использовании instanceof вам необходимо знать класс «B» во время компиляции.При использовании «isAssignableFrom» он может быть динамическим и изменяться во время выполнения.

Если вам неудобно сравнение строк, вы также можете использовать перечисления.

0 голосов
/ 09 октября 2011

Оказывается, что мои два запроса в этом посте были больше связаны, чем ожидалось.

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

Путем «обнуления» этой информации мой вид имеет правильные размеры, но макет не знает, где его разместить, поэтому просто не знает.

Следующий код для нового onMeasure показывает, как просто изменяя высоту и ширину LayoutParams, уже прикрепленных к моему представлению, я избегаю как перезаписи информации о положении макета, так и создания новых LayoutParams на основе типа родителя.

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int specWidth = MeasureSpec.getSize(widthMeasureSpec);
        int specHeight = MeasureSpec.getSize(heightMeasureSpec);

        int newWidth = (int) Math.ceil(parentWidth * 0.8);
        int newHeight = (int) Math.ceil(parentHeight * 0.8);

        this.setMeasuredDimension(newWidth, newHeight);

        this.getLayoutParams().height = newHeight;
        this.getLayoutParams().width = newWidth;

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

Теперь я буду честен и скажу, что этот код по-прежнему не содержит ошибок.Многократный перенос действия на передний план и фон постоянно уменьшает размер этого настраиваемого представления.Коэффициент уменьшения 0,8 применяется снова и снова при каждом запуске операции (я подозреваю, что настройка LayoutParams имеет к этому отношение, она может быть на самом деле ненужной, но у меня нет времени на тестирование).

НО, это все же ответило на вопрос, касающийся этого поста, а именно, почему мое мнение вообще не появилось, несмотря на наличие правильных размеров.

0 голосов
/ 04 октября 2011

Это может быть проблемой?

this.setLayoutParams(new RelativeLayout.LayoutParams(newWidth,parentHeight)); // <-- a RelativeLayout params?
...