Рубрики
Без рубрики

Как создать приложение для Android: Указатель даты

Еще раз всем привет, Прежде всего, большое вам спасибо за всю поддержку в пиаре… С тегом android, java, учебник.

Всем еще раз привет

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

  • Функция записи, позволяющая пользователю вводить свое имя пользователя с учетом некоторых ограничений.
  • Закодируйте указатель даты, который всплывает, когда пользователь нажимает на текстовое представление.

Для функциональности имени пользователя ограничения будут следующими:

  • Пользователь может выбрать любой тип символов, будь то цифры, буквы или специальные символы, кроме новых строк. Длина поля может быть ограничена 15 символами. Для datepicker идея заключается в следующем:
  • Указатель даты должен всплывать, когда пользователь нажимает на текстовое представление.
  • Средство выбора даты должно считывать выбор пользователя.
  • Как только дата выбрана, в текстовом представлении может отображаться полная дата.

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

Мы собираемся увидеть наш дизайн и открыть атрибуты

Как вы можете видеть, тип ввода по умолчанию – textPersonName, но мы можем изменить его на то, что мы хотим (или, по крайней мере, на то, что доступно), нажав на флажок слева от текста textPersonName, вы должны увидеть что-то вроде этого.

Для нас выбор по умолчанию является функциональным. Теперь перейдите в меню атрибутов и найдите атрибут Максимальная длина . После того, как мы найдем атрибут, мы установим 15 в качестве максимальной длины.

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

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

    

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

Перейдите в свой основной класс activity и объявите четыре переменные в верхней части класса, перед нашим первым методом; не забудьте сделать их все закрытыми.

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private TextView birthday;
    private int mYear;
    private int mMonth;
    private int mDay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
//        FloatingActionButton fab = findViewById(R.id.fab);
//        fab.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
//                        .setAction("Action", null).show();
//            }
//        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open,
                R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        navigationView.setNavigationItemSelectedListener(this);

        birthday = findViewById(R.id.profile_birthday_textview);

    }

Внутри метода onCreate инициализируйте переменную дня рождения с помощью findViewById . Если вы не инициализируете свою переменную, среда разработки не сообщит вам об ошибке, и вы не заметите ее до тех пор, пока не запустите ее, что приведет к сбою приложения из-за исключения нулевого указателя.

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

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

Внутри метода выберите дату, щелкнув , мы создадим:

  • Экземпляр календаря (получение сегодняшней даты)
  • Диалоговое окно выбора даты с использованием виджета Android. Для этого вам потребуется реализовать метод onDateSet , среда разработки не позволит вам пропустить это предупреждение, а также там будет написана самая важная часть кода.

Ваш код должен быть похож на этот.

Важное примечание: Экземпляр календаря должен быть окончательным, другими словами, наша переменная c не может быть изменена. Помните, что ключевое слово final позволяет назначить переменную один раз.

final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = 
    new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
               @Override
               public void onDateSet(DatePicker datePicker, int i, 
                                      int i1, int i2) {

               }
    });

Как вы могли заметить, наша реализация datepickerdialog содержит три переменные: i , i1 и i2 . Эти переменные означают год, месяц и день соответственно. По моему личному мнению… они непонятны, и чтобы разобраться в значении каждого из них, вам нужно отладить и оценить их ценности, ужасно. Ради нашего психического здоровья мы меняем его на соответствующие имена переменных.

Виджет календаря тоже должен быть инициализирован, иначе он выдаст ошибку. Инициализация соответствует начальной дате, которую будет отображать виджет. Вот когда наши глобальные переменные вступают в действие, после второй фигурной скобки, перед круглой скобкой и точкой с запятой мы добавляем год, месяц и дату, разделенные запятой. На данный момент ваш код чем-то похож на этот.

final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = 
    new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
               @Override
               public void onDateSet(DatePicker datePicker, int year, 
                                      int month, int day) {

               }
    }, mYear, mMonth, mDay);

Мы недалеко ушли от достижения наших целей, продолжайте в том же духе. Логика внутри нашей реализации datepicker заключается в следующем:

  • Преобразование входных переменных в строку
  • Преобразовать номер месяца в название месяца
  • Добавьте недостающий ноль в день
  • Показать окончательный текст

Причина преобразования входных переменных в строку состоит в том, чтобы объединить их в одну строку с датой.

Мы создадим еще один метод в основном классе с именем getMonth , логика этого метода заключается в получении названия месяца с помощью DateFormatSymbols .

private String getMonth(int month){
    return new DateFormatSymbols().getMonths()[month];
}

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

Далее вам нужно перевести или преобразовать месяц во что-то другое, например, я говорю по-испански, поэтому я бы хотел, чтобы месяц был на испанском языке. Это достижение будет достигнуто путем создания переменной Map<Целое число, строка> .

private Map monthTranslation = new HashMap<>();

Я заполню эту переменную внутри метода onCreate , напомню, что нужно начинать с 0.

monthTranslation.put(0, "Enero");
monthTranslation.put(1, "Febrero");
monthTranslation.put(2, "Marzo");
monthTranslation.put(3, "Abril");
monthTranslation.put(4, "Mayo");
monthTranslation.put(5, "Junio");
monthTranslation.put(6, "Julio");
monthTranslation.put(7, "Agosto");
monthTranslation.put(8, "Septiembre");
monthTranslation.put(9, "Octubre");
monthTranslation.put(10, "Noviembre");
monthTranslation.put(11, "Diciembre");

Затем перейдите к своему методу getMonth и сделайте получение из вашей переменной карты ((в моем случае это месячные переводы )

private String getMonth(int month) {
    return monthTranslation.get(month); Translation
}

И вот пожалуйста, у тебя есть месяц на испанском. Возвращаясь к нашей главной цели.

Четвертый пункт – добавление нуля слева в нашей переменной day. Я решил дополнить переменную нулем, потому что мое восприятие говорит, что это выглядит великолепно.

В нашем основном классе будет создан еще один метод со строковым параметром и возвращением строки. Логика заключается в проверке длины параметра, если она меньше 2, то есть 1, то мы добавляем ноль за параметром, а в остальном остаемся прежними. Я использовал троичный оператор, чтобы избежать добавления ненужных строк.

private String addLeftZero(String s) {
    String newString = (s.length() < 2) ? "0"+s : s;
    return newString;
}

Заключительная часть – это объединение всего вместе внутри реализации datepicker. Мы преобразуем день и год в строку, месяц останется целым числом, но будет параметром для нашего метода Получить месяц . Строка day является параметром метода добавить левый ноль , чтобы окончательно объединить все вместе в текстовом представлении. Поэтому ваш код должен быть таким

    public void pickDateOnClick(View view) {
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePickerDialog = new DatePickerDialog(this, 
                 new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                String sDay = String.valueOf(day);
                String sMonth = getMonth(month);
                String sYear = String.valueOf(year);

                sDay = addLeftZero(sDay);

                birthday.setText(sMonth + " " + sDay + ", " + sYear);
            }
        }, mYear, mMonth, mDay);
        datePickerDialog.show();
    }

Я почти забыл об этом!, не упустите возможность добавить показ в свою переменную datepicker, иначе он не будет отображаться на вашем экране.

Чтобы завершить всю функциональность, мы возвращаемся к дизайну, выбираем ваш textview, назначенный для выбора даты, и ищем атрибут ONCLICK в меню атрибутов, редактируя его с помощью имени метода выбора даты.

Весь код, показанный здесь, является общедоступным на github , не стесняйтесь им пользоваться.

Оригинал: “https://dev.to/edrome/how-to-create-an-android-app-part-2-ojl”