В Android, как создать EditText фиксированной ширины?

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

Первые 2 выполняются с помощью: android:inputType="number" и android:maxLength="4".

Как установить минимальную длину?


person ab11    schedule 23.11.2010    source источник
comment
исключает (исключает) или принимает (включает)?   -  person B. Clay Shannon    schedule 16.05.2014


Ответы (11)


Немного хакерски, но вы можете поместить свой EditText в FrameLayout вместе с другим TextView с text="0000" и visibility=invisible.

FrameLayout Должен быть width=wrap_content, а ваш EditText будет иметь width=match_parent.
Это должно быть всегда делайте его правильной ширины.

Преимущество этого в том, что это 100% xml-сторона, без кода.

<FrameLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="0000"
    android:visibility="invisible" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:maxLength="4" />
</FrameLayout>
person Jean    schedule 23.11.2010
comment
Это на самом деле работает лучше, чем ответ kcoppock, потому что это приводит к текстовому просмотру точной правой стороны. Но, определенно хакерский. - person ab11; 23.11.2010
comment
Я попытался сделать то, что сказала Джин, но по какой-то причине не смог. В итоге я использовал подсказки. - person Quv; 30.06.2012
comment
В современную эпоху компоновки с ограничениями этот небольшой лайфхак вполне может работать для числовых текстов фиксированной ширины. Вам просто нужно ограничить свой EditText невидимым TextView, и нет необходимости во вложенном макете. - person Dave S; 18.06.2018

Один редко используемый (AFAIK) атрибут EditText, который вы можете использовать:

android:ems="4"

Это делает EditText шириной ровно 4 ems. Ширина em — это ширина самого широкого (M) символа в выбранном шрифте.

person Kevin Coppock    schedule 23.11.2010
comment
Это работает, но поскольку я разрешаю только числовой ввод, ширина 4 em намного шире, чем нужно. Я могу поиграться, чтобы получить лучшую ширину, но это все еще немного неточно. - person ab11; 23.11.2010
comment
Работал отлично для меня. Мне просто нужно было текстовое поле фиксированной длины, которое могло бы содержать от 1 до 5 цифр и хорошо выглядеть независимо от того, сколько цифр ввел пользователь. - person ArtOfWarfare; 07.09.2012
comment
Может быть, это редко, но я часто использую это для своих макетов, когда мне нужно добиться одинаковой длины полей. Если шрифт или размер шрифта изменяются, он адаптируется, в отличие от решений, которые устанавливают неизменную длину на основе пикселей. - person John Jorsett; 26.03.2014
comment
ПРИМЕЧАНИЕ. Это отключает многострочный текст, вместо этого разрешая перенос. - person Don Larynx; 21.05.2015
comment
И если вы хотите сделать это в java, setEms(int); - person Jey10; 19.11.2015
comment
@kcoppock, могу я попросить вас взглянуть на вопрос об Android здесь: stackoverflow.com/questions/36968503/ ? - person Istiaque Ahmed; 01.05.2016

В моей ситуации мне нужно было, чтобы представление было шириной 6 цифр. android:ems сделал поле слишком широким (поскольку М-символ шире цифры).

В итоге я использовал прозрачную подсказку, которая определяет минимальную ширину поля. Пример ниже состоит из шести цифр.

<EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="000000"
        android:textColorHint="#00FFFFFF"
        android:maxLength="6"
        android:inputType="numberPassword" />

Это решение не зависит от шрифта, межбуквенного интервала и других вещей, которые могут различаться. TextColorHint — это 0% непрозрачный белый цвет, поэтому подсказка никогда не должна быть видна пользователю.

person MW.    schedule 20.04.2015
comment
Это самое простое решение сработало лучше всего. решение kcoppock мне не помогло. - person Chandra Sekhar; 30.06.2016

Вы также можете попробовать использовать . . .

android:ems="4"
android:maxEms="4"
android:layout_width="wrap_content"

. . . это должно обеспечить максимально плотное прилегание, возможное для стиля редактирования текста Android по умолчанию.

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

android:background="#ffffff"
android:paddingLeft="0dp"
android:paddingRight="0dp"
person Chris Sullivan    schedule 19.06.2013

Используйте android:width="XXX.Xdp"

Это позволяет вам установить ширину в пикселях плотности, которая должна быть относительно плотности экрана. Я попытался использовать ems на основе поля шириной 2 символа, но, поскольку ems требует int, 2 было слишком маленьким, а 3 слишком большим. Блех.

person mike fratto    schedule 04.03.2011

Существует невероятно простой способ сделать это программно.

myEditText.setLayoutParams(new LinearLayout.LayoutParams(200, 50));

Это установит ширину на 200 и высоту на 50!!

Наслаждаться :)

person wea    schedule 09.08.2013
comment
Тогда, конечно, вам нужно будет вручную увидеть, какой будет ширина четырех символов, но я все еще думаю, что это действительно удобный способ ручной установки ширины и высоты EditText! - person wea; 09.08.2013

Не знаю о встроенном решении, но вы можете попробовать пассивно проверить длину и поднять диалог с сообщением об ошибке в момент отправки.

person Vladimir Ivanov    schedule 23.11.2010

Проблема в том, что виджет EditText может потерять фокус из-за множества различных действий, таких как прикосновение к другому чувствительному представлению, кнопке меню или (жесткое управление курсором с клавиатуры) и так далее. Ограничение максимальной длины или типа ввода может быть сделано в процессе связывания (принять символ, если он проходит фильтр или длина не превышена). но потеря фокуса может происходить каждый раз - даже отправка еще не завершена, а ввод в короткий -> поэтому нет встроенного решения минимальной длины, потому что приложение заблокировало бы в этот момент выполнение другое событие или задача. По крайней мере, вы должны подтвердить свой ввод, прежде чем переходить к следующему шагу рабочего процесса.

person Impression    schedule 23.11.2010

Я использую android:layout_width="60dip", так что согласен с Майком Фратто.

Решение ems также кажется интересным.

Фил

person Phil    schedule 23.03.2011

Вы можете установить выравнивание по-другому, когда вы помещаете символ больше, чем ширина wditText, чем ширина увеличения или ширина EditText. Пожалуйста, установите параметры LeftOf и ToRightOf в представлении выше, чтобы управлять этими вещами. Только одно решение

person Ramkailash    schedule 29.09.2014

**EditText.xml**

 <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/resetpage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:orientation="vertical">
         <EditText
            android:layout_marginTop="80dp"
            android:layout_width="350dp"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:textSize="20sp"
            android:gravity="top"
            android:background="@drawable/border"
            />

 </LinearLayout>


write this code inside the linear layout or u can customize the constraints

поля в editText в соответствии с вашим макетом, а фон предназначен только для границы editText в папке drawable.

**border.xml**-->just paste this file in the drawable folder 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#D0D0D0"/>
            <corners android:radius="10dp" />
        </shape>
    </item>

    <item
        android:left="2dp"
        android:right="2dp"
        android:top="2dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/browser_actions_bg_grey"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>
person Hashir Hasan    schedule 30.06.2021