Автор оригинала: Kevin Farst.
Некоторое время назад я посетил буткемпинг для Android, в ходе которого мы создали несколько приложений как мы узнали. Одним из приложений, которое нам было поручено создать, было Твиттер приложение и один из функции, которые я хотел создать, были почти культовым счетчиком символов для композиции твитов, поскольку они, конечно, ограничены 140 символами. При вводе каждого символа серый текст отсчитывается до нуля, затем становится красным и продолжает обратный отсчет в отрицательном диапазоне.
Кроме того, поскольку API Twitter отклонит любой твит, содержащий более 140 символов, нам необходимо отключить кнопку рядом со счетчиком, чтобы предотвратить попытку публикации твита.
Приступая к работе
Мы будем использовать привязку данных, поэтому в нашем build.gradle
для нашего приложения
модуля нам нужно будет включить ее.
android { ... dataBinding.enabled = true ... }
В файле макета фрагмента нам нужно предоставить переменную, чтобы связать логику из класса фрагмента со значениями внутри макета. Файлы компоновки привязки данных должны быть завернуты в макет
тег, за которым следует список переменных
тегов в открывающихся и закрывающихся данных
метка. Переменная тег, который мы добавим, – это то, что Android будет использовать для привязки свойства наши
Составьте фрагмент твита
в fragment_compose_tweet.xml
макет.
...
Мы скоро вернемся к объяснению TweetViewModel
. Вернемся к нашему Составьте фрагмент твита
класс, нам нужно добавить переменную , которая называется tweetViewModel
для привязки нашей переменной, объявленной в макете, к классу фрагмента. Из документации,
По умолчанию класс привязки будет создан на основе имени файла макета, преобразовав его в регистр Pascal и добавив к нему суффикс “Привязка”.
Поэтому переменная, которую мы объявим, будет иметь тип Привязка фрагмента К Твиту
.
... public class ComposeTweetFragment extends DialogFragment { ... private FragmentComposeTweetBinding binding; ... }
В методе onCreate
мы раздуваем представление, назначаем привязку нашей частной переменной и устанавливаем значение нашей переменной, определенной в макете tweetViewModel
.
... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_compose_tweet, container, false); binding = FragmentComposeTweetBinding.bind(view); // Bind view model for observing the number of tweet characters binding.setTweetViewModel(new TweetViewModel(tweet)); ... } ...
Переменная tweet
берется из значения, переданного в класс фрагмента.
Откуда взялась модель TweetViewModel?
Возвращаясь к классу TweetViewModel
, давайте рассмотрим часть определения, поскольку это класс, который мы объявляем сами.
... public class TweetViewModel { private static Integer TOTAL_TWEET_LENGTH = 140; private Tweet tweet; public ObservableFieldcharactersRemaining = new ObservableField<>(TOTAL_TWEET_LENGTH); ... }
Примечательным элементом, на который следует обратить внимание здесь, является свойство Наблюдаемое поле
, которое обеспечивает способ уведомления пользовательского интерфейса, связанного с данными, об изменениях. Количество символов динамически изменяется в зависимости от ввода пользователем, поэтому ему необходимо знать, когда следует обновлять. Нам также нужно добавить TextWatcher
в класс для просмотра поля EditText
по мере ввода пользователем.
... public TextWatcher watcher = new TextWatcher() { @Override public void afterTextChanged(Editable editable) { tweet.setStatus(editable.toString()); charactersRemaining.set(TOTAL_TWEET_LENGTH - editable.toString().length()); } }; ...
Наконец, в нашем fragment_compose_tweet.xml
файл макета (и показывающий только свойства, связанные с создаваемой нами функциональностью), у нас есть:
Мы используем синтаксис @{}
для интерполяции ваших выражений, связанных с данными, которые по типу элемента являются
Редактируемый текст
- текст – Фактическое тело твита.
- addTextChangedListener – Наблюдатель за текстом, который определяет, когда следует обновлять количество символов.
Текстовое представление
- текст – Динамическое количество оставшихся символов (
""+
приводитЦелое число
к типуСтрока
). - Цвет текста – Если количество оставшихся символов находится в диапазоне от 0 до 140, цвет текста будет серым, в противном случае при отрицательном подсчете текст станет красным.
Кнопка
- альфа – Показать частично исчезнувшую кнопку, указывающую, что она отключена, если пользователь еще не начал вводить твит или если он набрал более 140 символов.
<
необходимо экранировать. - кликабельный – Разрешить нажатие кнопки, если пользователь набрал хотя бы один символ и не более 140. В
<
и&&
нужно сбежать.
Вывод
Как привязка данных, так и наблюдаемые объекты являются очень мощными концепциями в Android, и я призываю вас изучить широкий спектр способов их использования в ваших приложениях. Официальная документация – лучшее место для начала, и их множество других учебных пособий легко найти в Гуглах. Я показал только минимальный код для объяснения рассматриваемой темы, но если вы хотите еще раз просмотреть учебник с полным исходным кодом, вы можете найти его в моей учетной записи GitHub здесь . Если у вас есть какие-либо вопросы или предложения по улучшению структуры приведенного выше кода, пожалуйста, не стесняйтесь комментировать. Удачи и спасибо за чтение!
Оригинал: “https://www.codementor.io/@kevinfarst/creating-a-twitter-style-text-counter-in-android-using-data-binding-7hvi8lold”