Вопрос по android-layout, android – Создание двух LinearLayouts по 50% экрана без использования layout_weight

6

В настоящее время я делаю специальную XML-компоновку ландшафтного экрана, где присутствуют 4 изображения и 2 LinearLayouts рядом друг с другом, по 2 изображения. Эти LinearLayouts я называюlinearLayout1 а такжеlinearLayout2.

linearLayout1 отмечен синим прямоугольником:

linearLayout1

linearLayout2 отмечен синим прямоугольником:

linearLayout2

Как видите, первый использует ~ 80% экрана, а второй использует то, что осталось. Я не хочу этого, конечно, я хочу 50% для каждого. Я не могу использоватьlayout_weight потому что он уже используется в самих LinearLayouts (позиционирование двух изображений), а вложенные веса ухудшают производительность.

Я пробовал много разных вариантов, но я просто не могу получить, чтобы у двух LinearLayouts было по 50% экрана каждый. Вот код:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/db1_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<LinearLayout
    android:id="@+id/title_container"
    style="@style/TitleBar" >

    <ImageView
        style="@style/TitleBarLogo"
        android:contentDescription="@string/imgViewDesc"
        android:src="@drawable/title_logo" />

    <ImageView
        style="@style/TitleBarSeparator"
        android:contentDescription="@string/imgViewDesc" />

    <TextView style="@style/TitleBarText" />

    <ImageButton
        style="@style/TitleBarAction"
        android:contentDescription="@string/imgViewDesc"
        android:onClick="onClickAbout"
        android:src="@drawable/title_about" />
</LinearLayout>

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/title_container"
    android:layout_above="@+id/mobFoxView" >

    <!-- LEFT COLUMN -->

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/mobFoxView"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/linearLayout2"
        android:background="@color/white"
        android:gravity="center"
        android:orientation="vertical"
        android:weightSum="2" >

        <ImageView
            android:id="@+id/imgNews"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:contentDescription="@string/imgViewDesc"
            android:onClick="onClickFeature"
            android:src="@drawable/front_news_1" />

        <ImageView
            android:id="@+id/imgReleases"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:contentDescription="@string/imgViewDesc"
            android:onClick="onClickFeature"
            android:src="@drawable/front_releases_1" />
    </LinearLayout>

    <!-- RIGHT COLUMN -->

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_above="@+id/mobFoxView"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/linearLayout1"
        android:background="@color/white"
        android:gravity="center"
        android:orientation="vertical"
        android:weightSum="2" >

        <ImageView
            android:id="@+id/imgArtists"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:contentDescription="@string/imgViewDesc"
            android:onClick="onClickFeature"
            android:src="@drawable/front_artists_1" />

        <ImageView
            android:id="@+id/imgLabels"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:contentDescription="@string/imgViewDesc"
            android:onClick="onClickFeature"
            android:src="@drawable/front_labels_1" />
    </LinearLayout>
</RelativeLayout>

<com.mobfox.sdk.MobFoxView
    android:id="@+id/mobFoxView"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    mode="test"
    publisherId="@string/mobFoxID" />

</RelativeLayout>
Я бы все равно использовал вложенный layout_weight. производительность не будет такой плохой. Xi Zhang

Ваш Ответ

4   ответа
0

Без layout_weight поместите оба этих линейных макета в родительский линейный макет

<LinearLayout orientation:horizontal>
           <LinearLayout Child 1 />
           <LinearLayout Child 2 />
</LinearLayout>

центрируйте их, используя layout_gravity, если содержимое этих линейных макетов имеет одинаковый размер, они должны быть одинакового размера

если нет, то у вас все еще может быть проблема

и может потребоваться изменить размер с помощью кода

24

Ну, есть два варианта, которые я вижу здесь.

  1. Screw that LINT warning and use the nested weights anyway. Phones are fast and it will make milliseconds worth of a difference since you only inflate layouts once (most of the time). Having nested layouts is only bad for performance because the inflator needs to make more passes to measure the layouts.

  2. Swap your top LinearLayout with a RelativeLayout and align the two children to an invisible View in the center like so:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/top"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
      android:id="@+id/center_point"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_centerInParent="true"/>

    <LinearLayout
      android:id="@+id/left_layout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_alignParentLeft="true"
      android:layout_alignRight="@+id/center_point">
    </LinearLayout>


    <LinearLayout
      android:id="@+id/right_layout"
      android:orientation="horizontal" //default
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_alignParentRight="true"
      android:layout_alignLeft="@+id/center_point">
    </LinearLayout>

</RelativeLayout>
Error: User Rate Limit Exceeded eightx2
Error: User Rate Limit Exceeded eightx2
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededLinearLayoutError: User Rate Limit ExceededRelativeLayoutError: User Rate Limit ExceededLinearLayoutError: User Rate Limit Exceeded
0

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

4

Вы можете установить «Вес» для макетов, вот так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" >
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    </LinearLayout>
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    </LinearLayout>

Таким образом, каждый линейный выход занимает 50% экрана. :)

Похожие вопросы