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

Создание текстового счетчика в стиле Twitter в Android с использованием привязки данных

Начните писать здесь… Некоторое время назад я посетил буткемпинг для Android, в ходе которого мы создали несколько приложений, как мы узнали. Одним из приложений, которое нам было поручено создать, был [Twitter](http://twitter.co…

Автор оригинала: Kevin Farst.

Некоторое время назад я посетил буткемпинг для Android, в ходе которого мы создали несколько приложений как мы узнали. Одним из приложений, которое нам было поручено создать, было Твиттер приложение и один из функции, которые я хотел создать, были почти культовым счетчиком символов для композиции твитов, поскольку они, конечно, ограничены 140 символами. При вводе каждого символа серый текст отсчитывается до нуля, затем становится красным и продолжает обратный отсчет в отрицательном диапазоне.

Кроме того, поскольку API Twitter отклонит любой твит, содержащий более 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 ObservableField charactersRemaining = 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”