представление отображается по-разному, когда я разделить макет XML - PullRequest
0 голосов
/ 30 декабря 2011

Я довольно новичок в программировании Android, но не новичок в Java.

Я пытался настроить нетривиальное представление, и у меня странная проблема. Я разработал макет, который горизонтально прокручивает отдельные панели игроков (это еще один ScoreKeeper)

Итак, я создал playermain.xml с HorizontalScrollView и LinearLayout, чтобы он содержал динамически добавленные панели игроков, которые являются TableLayout.

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

Ничто из того, что я пробовал, не заставит игровые панели растягиваться - вместо этого они центрируются, но не заполняются. Странно то, что я попробовал быстрый тест, который должен был создать плоскую версию XML-файлов (т. Е. Я скопировал две копии XML PlayerPanel в основной XML. Когда я просто установил ContentView в этот комбинированный XML, я получаю представление Я хочу.

Когда я делаю это программно, я не растягиваюсь, и я должен что-то здесь упустить. Я также могу опубликовать комбинированный xml, но я счел это ненужным, в основном, когда я создаю один xml-файл с Scrolls, Layout и tablelayouts, все растягивается так, как я хочу. Когда я создаю Scroll / Layout с одним XML-файлом, а затем добавляю другие элементы на верхний уровень LinearLayout, они не растягиваются.

OnCreate: <---- СНИП ----->

   setContentView(R.layout.playingmain);
   final LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   LinearLayout llayout = (LinearLayout)findViewById(R.id.layout1);


       TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, null);
       InitializePlayer(player1,tl);
       llayout.addView(tl); 

<---- СНИП ----->

MAINPANEL.XML

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="horizontal"


    >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" 
        android:isScrollContainer="true" 
        android:scrollbarAlwaysDrawHorizontalTrack="true"
        android:gravity="center"
        >
    </LinearLayout>

</HorizontalScrollView>

Индивидуальная панель.xml:

 <TableLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:paddingLeft="5sp"
        android:stretchColumns="*"
        android:minWidth="200sp"
        >

        <TableRow
            android:id="@+id/NameRow"  
            android:minWidth="500sp"
            android:layout_weight = "1"
            >

            <TextView
                android:id="@+id/PlayerName"
                android:text="PlayerName" 
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                />

            <TextView
                android:id="@+id/dbg1"
                android:text="TextView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"

                />

        </TableRow>

        <TableRow
            android:id="@+id/scoreRow"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight = "1"  
            >

            <TextView
                android:id="@+id/currentScore"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="10"
                android:textAppearance="?android:attr/textAppearanceLarge" 
                />

            <TextView
                android:id="@+id/dbg2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="TextView" 
                />

        </TableRow>

        <TableRow
            android:id="@+id/TableRow17"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_weight = "1"  
            >

            <Button
                android:id="@+id/subtractButton"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="-"  
            />

            <EditText
                android:id="@+id/scoreEntry"
                android:layout_span = "2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:inputType="number" />

            <Button
                android:id="@+id/addButton"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="+" 
                />
        </TableRow>

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_weight = "1"  
            >

            <Button
                android:id="@+id/plusOne"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="+1" />

            <Button
                android:id="@+id/plusFive"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="+5" />

            <Button
                android:id="@+id/minusOne"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="-1" />

            <Button
                android:id="@+id/minusFive"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="-5" />

        </TableRow>

    </TableLayout>

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

Когда я добавляю раздутые объекты, мне нужно было указать правильный родительский объект вместо нуля. Как только я это сделал, все свойства xml превратились в представления.

Мне удалось подтвердить / отладить это с помощью средства просмотра иерархии.

  TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, null);

должно быть

  TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, llayout, false);
0 голосов
/ 31 декабря 2011

Akameswaran,

Причина такой несоответствия проста: XML "статически" определены с динамическими результатами, основанными на этих статических параметрах.То есть XML обеспечивает начальную инфляцию, используя начальное состояние, определенное этими XML-файлами.Код позволяет вносить изменения во время выполнения и обрабатывается двигателем как «динамический», даже если позиции и размеры постоянны.Это приводит к некоторым очень интересным отношениям для тех, кто не знаком с Android.

Когда у вас есть один файл XML, во время инфляции механизм рендеринга знает, что представляют собой все объекты и как они связаны с иерархией представления.Однако, когда вы разделяете файл XML, он не знает, что свойства дочерних представлений зависят от свойств родительских представлений, если вы не укажете это в коде.По сути, это происходит потому, что компьютер делает именно то, что вы ему говорите, и волнуется, если вы не говорите этого достаточно.Он будет «угадывать», но почти всегда угадывает неправильно.Как и HTML, Android работает так, чтобы работать как можно больше, предоставляя РЕЗУЛЬТАТ, если он может, даже если он неправильный.

Android предоставляет несколько способов преодолеть это: OnLayout () позволяет динамически применять позиционированиелюбой деятельности или просмотра объекта.OnMeasure () позволяет переопределять размеры.OnDraw () позволяет динамически рисовать или раздувать объект.Переопределив эти функции, вы можете вернуть поведение к тому, что вам нужно, и при этом сохранить XML-модульность, как вы того пожелаете.Поскольку вы используете стандартизированные элементы управления API, вы, вероятно, захотите переопределить функции непосредственно в Activity и сэкономить массу хлопот.

Надеюсь, это поможет, FuzzicalLogic

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