Intereting Posts
План Android с видом справа, который занимает заданное пространство и просматривает левые шкалы, чтобы заполнить остальную часть экрана до определенного предела Travis CI для Android – Ошибка сборки: не удалось найти цель и не удалось найти зависимости Использование Gson для анализа массива Json и объекта без имени После установки кнопок apk «Открыть» и «Готово», при нажатии кнопки «Открыть» он не добавляет категорию в качестве запуска Можете ли вы воспроизвести mp3-файл из папки с ресурсами? Исключить HTML-теги и некоторые символы UNICODE во время поиска в SQLite Возможно ли интегрировать Dagger и AspectJ в проекте Android Studio? Изменение цвета текста переполнения действий в ActionBar Удаление кнопок с изображениями (Android) Скрыть кнопку микрофона Виртуальная клавиатура Android AdView и FloatingActionButton перекрываются при использовании CoordinatorLayout Кнопка Google Play Store Отправить обновление отключена после внесения изменений Предупреждение о нарушении политики разработчика Google Play: требуется действие В чем разница между `@ Bind` и` @ BindView` в butterknife? Интеграция Facebook в Android?

Как ограничить время ввода для edittext в android

Я должен разрешить пользователю вводить только время в формате ##: ## в текстовом редакторе на лету, есть ли способ его достижения? Я использовал ниже код, но он не работает.

Я могу ввести число более 24 значений, таких как 45623: 5689.

edit.setInputType(InputType.TYPE_DATETIME_VARIATION_TIME) 

Даже android:text="time" также не работает.

Как я могу достичь этой цели. Может ли кто-нибудь предложить мне, как я могу это сделать.

Я хочу разрешить пользователю вводить первые 2 места до 23 значения, а затем компиляции: а затем пользователь может разрешить до 59 значений.

например

 23:59 correct 24:05 incorrect 02:56 correct 02:79 incorrect 

Я также использовал этот фильтр настройки, но не работал

Я получил этот код от кого-то еще в SO.

Код:

  InputFilter timeFilter = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); allowEdit &= (c >= '0' && c <= '9'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } }; 

Отредактированный вопрос: файл файла main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" android:padding="10dp" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/txtRecipientName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="20dp" android:text="@string/recipient_name" /> <EditText android:id="@+id/edTxtRecipient" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:paddingLeft="20dp" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <TextView android:id="@+id/txtParcelDeliverTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="20dp" android:text="@string/delivered_time" /> <EditText android:id="@+id/edTxtParcelDeliverTime" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:paddingLeft="20dp" > </EditText> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:orientation="horizontal" > <Button android:id="@+id/btnRecipient_OK" android:layout_width="100dp" android:layout_height="wrap_content" android:text="@android:string/ok" /> </LinearLayout> </LinearLayout> 

Этот код работает, но если я вставляю первый алфавит и вставляю надлежащее значение, то его не работает, потому что source содержит его предыдущее значение символа.

Solutions Collecting From Web of "Как ограничить время ввода для edittext в android"

Попробуйте отличить символы к ints, а затем проверьте, если они больше 24 и 60.

 int a = ((int) result.charAt(0)) - 48; int b = ((int) result.charAt(1)) - 48; int c = ((int) result.charAt(3)) - 48; if(a < 0 || b < 0 || c < 0) { Not right. } if((a > 2 || (a == 2 && b > 3)) || c > 59) { Neither is this. } 

Минус 48, потому что числа 0 равны 48 в таблице ascii. Тест должен быть ascii.

Вместо char почему вы не используете строку, потому что char также может использоваться для сравнения, поскольку он может возвращать числа

 char c ='a'; if(c>10) //do something //OR int x = c; 

Итак, почему вы не используете String вместо char

Или что вы можете сделать, возьмите 1-й два символа, используя подстроку или что-то в этом роде, и используйте метод Integer.parse () для ее синтаксического анализа, если он успешно проанализировал, тогда его действительное число еще не так, чтобы вы могли его проверить и аналогичным образом Это для следующих двух символов

РЕДАКТИРОВАТЬ

Если вы хотели реализовать как это 23:59 правильно 24:05 неверно 02:56 правильно 02:79 неверно

Тогда вот код, который работал с моей стороны

 public class MainActivity extends Activity { InputFilter timeFilter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timeFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); if(result.charAt(0) == '0' || result.charAt(0) == '1') allowEdit &= (c >= '0' && c <= '9'); else allowEdit &= (c >= '0' && c <= '3'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } }; EditText txt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); txt1.setFilters(new InputFilter[]{timeFilter}); } } 

Я только что взял ваш XML и разместил его в качестве основного макета, и никаких изменений в XML сейчас нет. Попробуйте это и скажите?

EDIT 2 Теперь здесь я добавил validtion для проверки firs char с использованием значения doneOnce boolean Это работает сейчас, скажите мне, есть ли у вас какая-либо другая проблема из этого кода сейчас

 public class MainActivity extends Activity { EditText edt1; InputFilter timeFilter; private String LOG_TAG = "MainActivity"; private boolean doneOnce = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timeFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if(source.length() > 1 && doneOnce == false){ source = source.subSequence(source.length()-1, source.length()); if(source.charAt(0) >= '0' && source.charAt(0) <= '2'){ doneOnce = true; return source; }else{ return ""; } } if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2'); } if (result.length() > 1) { c = result.charAt(1); if(result.charAt(0) == '0' || result.charAt(0) == '1') allowEdit &= (c >= '0' && c <= '9'); else allowEdit &= (c >= '0' && c <= '3'); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5'); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'); } return allowEdit ? null : ""; } }; edt1 = (EditText) findViewById(R.id.edTxtParcelDeliverTime); edt1.setFilters(new InputFilter[] { timeFilter }); } } 

Попробуй это . Я просто отредактировал код, который вы предоставили.

  InputFilter[] timeFilter = new InputFilter[1]; timeFilter[0] = new InputFilter() { public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() == 0) { return null;// deleting, keep original editing } String result = ""; result += dest.toString().substring(0, dstart); result += source.toString().substring(start, end); result += dest.toString().substring(dend, dest.length()); if (result.length() > 5) { return "";// do not allow this edit } boolean allowEdit = true; char c; if (result.length() > 0) { c = result.charAt(0); allowEdit &= (c >= '0' && c <= '2' && !(Character.isLetter(c))); } if (result.length() > 1) { c = result.charAt(1); allowEdit &= (c >= '0' && c <= '9' && !(Character.isLetter(c))); } if (result.length() > 2) { c = result.charAt(2); allowEdit &= (c == ':'&&!(Character.isLetter(c))); } if (result.length() > 3) { c = result.charAt(3); allowEdit &= (c >= '0' && c <= '5' && !(Character.isLetter(c))); } if (result.length() > 4) { c = result.charAt(4); allowEdit &= (c >= '0' && c <= '9'&& !(Character.isLetter(c))); } return allowEdit ? null : ""; } }; 

Для меня это работает отлично. Принимает время только в формате hh: mm (другой символ не принят)