n.b .: Я собирался опубликовать весь этот XML на Pastebin, но я думаю, что важно заархивировать его здесь для потомков, поэтому, пожалуйста, извините за длину примера кода! Лучше иметь больше информации, чем меньше, верно?
Рассмотрим следующую схему калькулятора. (Я жестко запрограммировал строки только для этого поста - они обычно являются ресурсами.)
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/calculator"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"
android:orientation="vertical"
android:stretchColumns="*">
<TableRow android:id="@+id/tableRowFieldName"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/textViewFieldName"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_marginTop="0dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="0dp"
android:layout_marginLeft="5dp"
android:padding="0dp"
android:text="Label"
android:textSize="20dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
<TableRow android:id="@+id/tableRowDisplay"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/textViewDisplay"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_margin="5dp"
android:layout_marginTop="0dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="0dp"
android:layout_marginLeft="5dp"
android:padding="0dp"
android:text="Value"
android:textSize="35dp"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceLarge" />
</TableRow>
<TableRow android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.2">
<Button android:id="@+id/buttonA"
style="@style/ParameterButton"
android:text="Param A" />
<Button android:id="@+id/buttonB"
style="@style/ParameterButton"
android:text="Param B" />
</TableRow>
<TableRow android:id="@+id/tableRow2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.2">
<Button android:id="@+id/buttonC"
style="@style/ParameterButton"
android:text="Param C" />
<Button android:id="@+id/buttonD"
style="@style/ParameterButton"
android:text="Param D" />
</TableRow>
<TableRow android:id="@+id/tableRow3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.2">
<Button android:id="@+id/buttonE"
style="@style/ParameterButton"
android:text="Param E" />
<Button android:id="@+id/buttonF"
style="@style/ParameterButton"
android:text="Param F" />
</TableRow>
<TableRow android:id="@+id/tableRow4"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.4">
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:layout_weight="1.0" />
<TableLayout android:id="@+id/calcKeypad"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:stretchColumns="*">
<TableRow
android:layout_weight="0.25"
android:gravity="center">
<Button android:id="@+id/button7"
style="@style/KeypadButton"
android:text="7" />
<Button android:id="@+id/button8"
style="@style/KeypadButton"
android:text="8" />
<Button android:id="@+id/button9"
style="@style/KeypadButton"
android:text="9" />
</TableRow>
<TableRow
android:layout_weight="0.25"
android:gravity="center">
<Button android:id="@+id/button4"
style="@style/KeypadButton"
android:text="4" />
<Button android:id="@+id/button5"
style="@style/KeypadButton"
android:text="5" />
<Button android:id="@+id/button6"
style="@style/KeypadButton"
android:text="6" />
</TableRow>
<TableRow
android:layout_weight="0.25"
android:gravity="center">
<Button android:id="@+id/button1"
style="@style/KeypadButton"
android:text="1" />
<Button android:id="@+id/button2"
style="@style/KeypadButton"
android:text="2" />
<Button android:id="@+id/button3"
style="@style/KeypadButton"
android:text="3" />
</TableRow>
<TableRow
android:layout_weight="0.25"
android:gravity="center">
<Button android:id="@+id/buttonClear"
style="@style/KeypadButton"
android:text="C" />
<Button android:id="@+id/button0"
style="@style/KeypadButton"
android:text="0" />
<Button android:id="@+id/buttonDecimal"
style="@style/KeypadButton"
android:text="." />
</TableRow>
</TableLayout>
<LinearLayout android:id="@+id/linearLayoutTotal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button android:id="@+id/buttonTotalWeight"
style="@style/FunctionButton"
android:text="Function A" />
<Button android:id="@+id/buttonTotalCost"
style="@style/FunctionButton"
android:text="Function B" />
<Button android:id="@+id/buttonAbout"
style="@style/FunctionButton"
android:layout_height="0dp"
android:layout_weight="0.25"
android:text="Function C" />
</LinearLayout>
</TableRow>
</TableLayout>
При этом используются следующие стили (по сути взятые из исходного XML):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CalcButton">
<item name="android:textColor">#ffffff</item>
<item name="android:textSize">15dp</item>
<item name="android:textStyle">bold</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_margin">2dp</item>
</style>
<style name="ParameterButton" parent="CalcButton">
<item name="android:layout_width">0dp</item>
<item name="android:layout_weight">0.5</item>
</style>
<style name="KeypadButton" parent="CalcButton">
<item name="android:textSize">20dp</item>
</style>
<style name="FunctionButton" parent="CalcButton">
<item name="android:layout_height">0dp</item>
<item name="android:layout_weight">0.375</item>
</style>
</resources>
Если вы хотите перенести все это в проект Android, вы должны увидеть три ряда кнопок с двумя параметрами вверху, за которыми следует цифровая клавиатура с тремя функциональными кнопками справа от клавиатуры. В большинстве случаев безвредна. (Кроме того, он будет использоваться только в портретной ориентации - поэтому не стоит беспокоиться о том, чтобы учитывать ландшафт).
Однако ... обратите особое внимание на ListView в XML. Вы пока не увидите его в визуальном виде, поскольку он имеет android:visibility="gone"
. Идея состоит в том, что в определенные моменты я удаляю это, а затем устанавливаю цифровую клавиатуру (смежную TableLayout ) вместо android:visibility="gone"
, показывая список на своем месте.
Другими словами, желаемый эффект состоит в том, что список и цифровая клавиатура занимают одно и то же место, так что я могу по своему желанию переключаться между ними.
Проблема, с которой я сталкиваюсь, заключается в том, что ListView после заполнения, похоже, намеревается занять всю высоту всей таблицы, уничтожив кнопки плохих параметров и собрав три функциональные кнопки для ездить.
Вы можете увидеть это, установив очень простой ArrayAdapter (я использовал android.R.layout.simple_list_item_1
и android.R.id.text1
) и бросив элементарный массив String
. На данный момент вручную переместите присвоение gone
из списка на соседний макет таблицы (или сделайте это в коде).
Установка фиксированной высоты кажется невозможной, поскольку это должно работать на различных дисплеях. На самом деле, я даже попытался ввести в заблуждение:
ListView list = (ListView) findViewById(android.R.id.list);
TableLayout calcKeypad = (TableLayout) findViewById(R.id.calcKeypad);
list.layout(calcKeypad.getLeft(), calcKeypad.getTop(), calcKeypad.getRight(), calcKeypad.getBottom());
calcKeypad.setVisibility(View.GONE);
list.setVisibility(View.VISIBLE);
Нет, это тоже не помогло.
В соответствии с документацией , я даже дал ListView правильный идентификатор, так как я хочу настроить его макет. Конечно, я не использую ListActivity , поэтому, возможно, это не имеет значения в этом случае. (Я просто использую обычную активность . Да, я пытался изменить это значение на ListActivity тоже. Никаких кубиков.)
Тем не менее, я полностью открыт для этой ошибки пилота. (На самом деле, я рассчитываю на это.) Я как раз в тот момент, когда он стал «бить головой о стену в миопии». «Должен быть лучший способ!»
Опять-таки, имейте в виду, что я очень стараюсь сохранить раскладку, чтобы она хорошо работала на экранах разных размеров (не на планшетах, а на портативных устройствах), отсюда и выбранная раскладка. Если есть лучший способ добиться того же визуального эффекта, я весь слух.
Итог: как сделать так, чтобы ListView занимал только область, занятую соседней клавиатурой калькулятора ( TableLayout )?
Подсказки / ответы / рекомендации приветствуются!