GridLayout рушится на небольшом дисплее

У меня есть LinearLayout с TextView , GridLayout и другим TextView . Он отображается правильно на многих современных телефонах и планшетах, но он полностью терпит неудачу на небольшом дисплее, таком как Nexus S. См. Следующие рисунки.

Введите описание изображения здесь Введите описание изображения здесь

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

Я попытался свести к минимуму код и свести его к GridLayout с одной строкой, и он по-прежнему не соответствует ширине экрана.

Что там происходит?

Обновить:

  • 420×800 mdpi работает
  • 420×800 hdpi нарушено
  • 540×920 hdpi работает
  • 720×1280 hdpi работает

Обновление 2:

Nexus 5x имеет такие же проблемы, когда шрифт 38sp или больше. Интересно, что дизайнер Studio показывает правильную компоновку, но оба устройства / эмулятора показывают искаженное представление и следующую ошибку:

 D/android.support.v7.widget.GridLayout: vertical constraints: y1-y0>=197, y2-y1>=197, y3-y2>=197, y4-y3>=197, y4-y0<=785 are inconsistent; permanently removing: y4-y0<=785. 

calc.xml:

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--Display row--> <TextView android:id="@+id/assignment" android:text="50 + 40 = 90" style="@style/Formula" android:focusable="false" android:layout_width="match_parent" android:layout_height="80dp" tools:ignore="HardcodedText" /> <android.support.v7.widget.GridLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:columnCount="4" app:rowCount="4"> <!-- row with 7-9,+ --> <Button android:id="@+id/digit7" android:text="7" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit8" android:text="8" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit9" android:text="9" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonPlus" android:text="+" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <!--row with 4-6, - --> <Button android:id="@+id/digit4" android:text="4" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit5" android:text="5" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit6" android:text="6" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonMinus" android:text="-" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <!--row with 1-3, * --> <Button android:id="@+id/digit1" android:text="1" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit2" android:text="2" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit3" android:text="3" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonMultiply" android:text="\u22C5" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <!--row with 0, backspace and / --> <Button android:id="@+id/digit0" android:text="0" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_columnWeight="1" app:layout_gravity="fill_horizontal" app:layout_rowWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonBackspace" android:text="←" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_gravity="fill_vertical" app:layout_columnSpan="2" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonDivide" android:text=":" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> </android.support.v7.widget.GridLayout> <!--row with button submit --> <Button android:id="@+id/buttonSubmit" android:text="@string/action_next_formula" style="@style/KeypadNextButton" android:layout_width="match_parent" android:layout_height="80dp" app:layout_gravity="fill_horizontal"/> </LinearLayout> 

стили:

 <style name="Formula"> <item name="android:textSize">@dimen/calc_button_text</item> <item name="android:textColor">@color/gray_35</item> <item name="android:gravity">center</item> <item name="android:background">@drawable/lcd</item> <item name="android:layout_marginTop">@dimen/calc_big_margin</item> <item name="android:layout_marginBottom">@dimen/calc_superbig_margin</item> <item name="android:layout_marginLeft">@dimen/calc_big_margin</item> <item name="android:layout_marginRight">@dimen/calc_big_margin</item> </style> <style name="KeypadButton" parent="@style/Widget.AppCompat.Button"> <item name="android:textSize">@dimen/calc_button_text</item> <item name="android:textColor">@color/white</item> <!--<item name="android:background">@drawable/tl_2</item>--> <item name="android:layout_marginLeft">@dimen/calc_small_margin</item> <item name="android:layout_marginBottom">@dimen/calc_small_margin</item> </style> <style name="KeypadLeftButton" parent="@style/KeypadButton"> <item name="android:layout_marginLeft">@dimen/calc_big_margin</item> </style> <style name="KeypadRightButton" parent="@style/KeypadButton"> <item name="android:layout_marginRight">@dimen/calc_big_margin</item> </style> <style name="KeypadNextButton" parent="@style/Widget.AppCompat.Button.Colored"> <item name="android:background">@drawable/tl_next</item> <item name="android:textSize">@dimen/calc_button_text</item> <item name="android:layout_marginTop">@dimen/calc_big_margin</item> <item name="android:layout_marginBottom">@dimen/calc_big_margin</item> <item name="android:layout_marginLeft">@dimen/calc_big_margin</item> <item name="android:layout_marginRight">@dimen/calc_big_margin</item> </style> 

Dimens:

 <dimen name="calc_button_text">14sp</dimen> <dimen name="calc_superbig_margin">2dp</dimen> <dimen name="calc_big_margin">1dp</dimen> <dimen name="calc_small_margin">0dp</dimen> 

Обновление 16-го февраля

Манджунат Прабхакар сказал, что проблема может быть связана с весами. Поэтому я попытался удалить все атрибуты веса, и макет теперь имеет больше смысла. Я еще не исправил это. Я бы подумал о переписывании макета для вложенных LinearLayouts в качестве шага назад, поэтому я делаю бонус открытым для других предложений.

Введите описание изображения здесь

Solutions Collecting From Web of "GridLayout рушится на небольшом дисплее"

Я предполагаю, что это ошибка поддержки версии GridLayout .

Взгляните на это (в настоящее время назначено ): Я думаю, что это связано с вашим вопросом о поведении размера шрифта Nexus 5X. В общем, я нашел много связанных ошибок здесь (связанных с измерением ширины GridLayout ).

Я постараюсь дать вам обходной путь.

Я использую com.android.support:gridlayout-v7:25.1.1 .

Я думаю, что вы можете решить свои проблемы с макетом (как выравнивание в старых телефонах, так и размер шрифта в Nexus 5X), делая так:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--Display row--> <TextView android:id="@+id/assignment" android:text="50 + 40 = 90" style="@style/Formula" android:focusable="false" android:layout_width="match_parent" android:layout_height="80dp" tools:ignore="HardcodedText" /> <android.support.v7.widget.GridLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:columnCount="4" app:rowCount="4"> <!-- row with 7-9,+ --> <LinearLayout app:layout_gravity="fill_horizontal" app:layout_columnSpan="4" android:orientation="horizontal" app:layout_rowWeight="1"> <Button android:id="@+id/digit7" android:text="7" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit8" android:text="8" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit9" android:text="9" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonPlus" android:text="+" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="match_parent" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> </LinearLayout> <!--row with 4-6, - --> <LinearLayout app:layout_gravity="fill_horizontal" app:layout_columnSpan="4" android:orientation="horizontal" app:layout_rowWeight="1"> <Button android:id="@+id/digit4" android:text="4" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit5" android:text="5" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit6" android:text="6" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonMinus" android:text="-" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="match_parent" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> </LinearLayout> <!--row with 1-3, * --> <LinearLayout app:layout_gravity="fill_horizontal" app:layout_columnSpan="4" android:orientation="horizontal" app:layout_rowWeight="1"> <Button android:id="@+id/digit1" android:text="1" style="@style/KeypadLeftButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit2" android:text="2" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/digit3" android:text="3" style="@style/KeypadButton" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" app:layout_rowWeight="1" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> <Button android:id="@+id/buttonMultiply" android:text="\u22C5" style="@style/KeypadRightButton" android:layout_width="wrap_content" android:layout_height="match_parent" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" /> </LinearLayout> <!--row with 0, backspace and / --> <LinearLayout app:layout_gravity="fill_horizontal" app:layout_columnSpan="4" android:orientation="horizontal" app:layout_rowWeight="1" android:weightSum="4"> <Button android:id="@+id/digit0" android:text="0" style="@style/KeypadLeftButton" android:layout_width="0dp" android:layout_height="match_parent" app:layout_columnWeight="1" app:layout_gravity="fill_horizontal" app:layout_rowWeight="1" tools:ignore="HardcodedText" android:layout_weight="1"/> <Button android:id="@+id/buttonBackspace" android:text="←" style="@style/KeypadButton" android:layout_width="0dp" android:layout_height="match_parent" app:layout_gravity="fill_vertical" app:layout_columnSpan="2" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" android:layout_weight="2"/> <Button android:id="@+id/buttonDivide" android:text=":" style="@style/KeypadRightButton" android:layout_width="0dp" android:layout_height="match_parent" app:layout_rowWeight="0.5" app:layout_columnWeight="1" tools:ignore="HardcodedText" android:layout_weight="1"/> </LinearLayout> </android.support.v7.widget.GridLayout> <!--row with button submit --> <Button android:id="@+id/buttonSubmit" android:text="NEXT" style="@style/KeypadNextButton" android:layout_width="match_parent" android:layout_height="80dp" app:layout_gravity="fill_horizontal"/> </LinearLayout> 

В основном, я сделал, чтобы обернуть каждую группу кнопок (четыре кнопки, кроме последней строки) в LinearLayout .

Здесь вы можете увидеть, как он выглядит в двух телефонах:

Нексус 5 Снимок экрана Nexus 5

Samsung Galaxy Core плюс (старше) Galaxy core плюс скриншот

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

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

Есть несколько ограничений и ограничений при использовании GridLayout. Вот ссылка на ДОКУМЕНТАЦИЮ

«GridLayout не поддерживает принцип веса, определенный по весу. В общем случае невозможно настроить GridLayout для распределения избыточного пространства в нетривиальных пропорциях между несколькими строками или столбцами … Для полного контроля над Избыточное распределение пространства в строке или столбце, используйте подкласс LinearLayout для хранения компонентов в связанной группе ячеек. "

Если бы я был вами, я бы использовал Linear layout или Table layout.

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