Кнопка не переносит свое содержимое

#android #button #layout

#Android #кнопка #макет

Вопрос:

Я использую простой горизонтальный LinearLayout, чтобы разместить 3 кнопки рядом друг с другом одинаковой ширины. Я добиваюсь этого с помощью следующего XML-текста:

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:baselineAligned="false" >

            <Button
                android:id="@ id/help"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/help" />

            <Button
                android:id="@ id/close"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/closemultigame" />

            <Button
                android:id="@ id/ok"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/restartmultigame" />

        </LinearLayout>
  

Теперь макет выглядит так:
скриншот из конструктора

Кнопка layout_height определяется как wrap_content, но крайняя правая кнопка не переносит свое содержимое. На разных устройствах это выглядит по-разному, на некоторых это выглядит хорошо. Чего я действительно хотел бы добиться, так это трех кнопок одинаковой ширины и одинаковой высоты, каждая из которых имеет текст, центрированный как по горизонтали, так и по вертикали. Какой подход вы бы предложили?

ДОБАВЛЕНО: весь макет в соответствии с запросом:

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/activity_horizontal_margin" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@ id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:drawableLeft="@drawable/matchandfit"
        android:drawablePadding="@dimen/activity_horizontal_margin"
        android:gravity="center_vertical"
        android:padding="@dimen/activity_horizontal_margin"
        android:text="@string/multigameover"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@ id/status"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/multigameresult"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <LinearLayout
        android:id="@ id/masterresult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@ id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/masterresultinfo"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:baselineAligned="false" >

            <Button
                android:id="@ id/help1"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="@string/help" />

            <Button
                android:id="@ id/close1"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="@string/closemultigame" />

            <Button
                android:id="@ id/ok1"
                style="android:buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="@string/restartmultigame" />

        </LinearLayout>



    </LinearLayout>
</LinearLayout>

</ScrollView>
  

Как указал Васим Ахмед, это связано с ScrollView. Теперь я использую ScrollView, чтобы убедиться, что кнопки остаются доступными даже в альбомной ориентации на небольших устройствах. (Макет предназначен для диалогового окна). Есть ли другой способ всегда сохранять кнопки доступными / видимыми?

ОБХОДНОЙ ПУТЬ: решением или лучшим обходным путем, который я нашел, было добавление TextView в конец заключающего LinearLayout. Это текстовое представление обрезано по вертикали примерно на половину его высоты, но оно не содержит текста, поэтому никто не заметит. Добавление некоторого отступа в нижнюю часть заключающего LinearLayout не помогло

Комментарии:

1. Я только что попробовал ваш код, и он здесь работает нормально .. с вашим кодом проблем нет .. я думаю, что ваш LinearLayout находится в другом Layout..so это связано с его высотой..

2. да, вы правы, но внешний линейный макет также имеет wrap_content для его высоты.

3. можете ли вы опубликовать весь XML-макет целиком ?? 🙂

4. да, добавил весь макет в мой пост

5. дорогой, я проверил это … это только из-за scrollview.

Ответ №1:

Снова и снова я замечал, что Button класс не приспосабливается к размеру текста, даже если вы укажете android:layout_height="wrap_content" .

Вы можете сделать одну из двух вещей:

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

2. TextView Вместо этого используйте a (который правильно переносит текст при указании android:layout_height="wrap_content" ), и вы устанавливаете onClickListener значение on TextView для имитации поведения кнопки.

Комментарии:

1. Та же проблема с TextView. Как указал Васим Ахмед, это связано с окружающим ScrollView…

Ответ №2:

Обходным путем для этого является набор minHeight Button таких

 android:minHeight="1dp"
  

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

Ответ №3:

Не переносите высоту кнопки, вместо этого используйте fill_parent , чтобы сделать высоту кнопок одинаковой друг с другом.

пример:

   <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:orientation="horizontal"
    android:baselineAligned="false" >

    <Button
        android:id="@ id/help"
        style="android:buttonBarButtonStyle"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="hilfe" />

    <Button
        android:id="@ id/close"
        style="android:buttonBarButtonStyle"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="beenden" />

    <Button
        android:id="@ id/ok"
        style="android:buttonBarButtonStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="neue Pundo" />

</LinearLayout>
  

Результат:

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

Комментарии:

1. Скопировал ваш XML-текст, но все тот же эффект для моей системы (Android 4.2. средство визуализации макета в eclipse, но тот же результат на моем Google Nexus 7)

2. @Gerhard но это большинство устройств??

3. Это 50% моих устройств 🙂

4. @Gerhard измените заливку, чтобы она соответствовала родительской, и сообщите мне результат

5. заполнить родительский элемент и сопоставить родительский элемент — это одно и то же, не так ли? Оба оцениваются как «-1»

Ответ №4:

Я просто попробовал, и это сработало:

1) Определите в .. /res/values/strings.xml:

Line1Line1 nLine2Line2

2) Обратитесь к нему в файле макета:

 <Button
    android:id="@ id/btn_multilines"
    android:text="@string/multilines"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">
</Button>
  

Ответ №5:

Не повезло с переносом текста внутри кнопки переключения с помощью android:layout_width=»wrap_content» и т. Д., Поэтому я добавил обратную косую черту n ( n) в строку метки, где я хотел переносить. Например, «Нажмите, чтобы НАЧАТЬ» стало, «Нажмите nto nSTART» Это сработало для меня.

Ответ №6:

Попробуйте использовать android:layout_width=»wrap_content» вместо android:layout_width=»0dp» и посмотреть идентификатор

Комментарии:

1. layout_width=»wrap_content» делает кнопки разной ширины

2. Затем попробуйте настроить настройку android:layout_height вручную, чтобы все кнопки имели одинаковую высоту и текст не обрезался!!

3. Если я установлю layout_height вручную, это сработает, но как насчет разных устройств?

4. ширина должна быть match_Parent..in этот случай

5. Попробуйте настроить размер шрифта, используя sp вместо dp. Это должно меняться в зависимости от устройства.