Когда нам нужно предоставить пользователям наших приложений возможность включать / выключать данную функцию, мы автоматически думаем о флажках, кнопках или переключателях:
Эти виджеты доступны нам «из коробки», но тогда мы ограничиваемся определенным внешним видом, который может быть, а может и не быть тем, что мы хотим в нашем приложении. Мы могли бы настроить переключатели, но если мы ищем что-то совершенно другое, есть другие способы дать пользователям визуальную обратную связь о том, включена ли данная функция или нет, например, с помощью простого текста и нескольких значков:
Мы могли бы переключаться из одного состояния в другое, просто прикоснувшись непосредственно к текстовому полю, вместо использования кнопок, переключателей или флажков, с единообразным интерфейсом для всех версий Android. Но как?
1. Выберите вкл / выкл иконки
Если у нас еще нет значков, их создание с помощью генератора значков в Android Asset Studio выполняется быстро и просто.
2. Выберите вкл / выкл Цвета
В файле res / values / colors.xml нашего проекта Android :
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="lightyellow">#FFFFE0</color> <!-- other colors here --> </resources>
3. Создайте макет
Это будет просто интерактивный TextView со связанным с ним Drawable:
<!-- WI_FI ON, OFF --> <TextView android:id="@+id/wifi_onoff" style="@style/..." android:text="@string/wifi_txt" android:lines="1" android:gravity="center_vertical" android:drawableLeft="@drawable/ic_wifi_off" android:clickable="true" android:onClick="toggleWifi"/>
Здесь обработчик события onClick toggleWifi объявлен в XML и будет реализован в соответствующем действии.
4. Отредактируйте связанную активность
//inside Activity //... // field private TextView tvWifi; // flag saved in prefs or db private boolean checkWifi; // colors private static final int COLOR_OFF = R.color.white; private static final int COLOR_ON = R.color.lightyellow; // icons private static final int IC_WIFI_OFF = R.drawable.ic_wifi_off; private static final int IC_WIFI_ON = R.drawable.ic_wifi_on; //... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... tvWifi = (TextView) findViewById(R.id.wifi_onoff); // get saved wifi status from db checkWifi = ... setWifi(checkWifi); } //... /** onclick handler */ public void toggleWifi(View view) { //toggle setWifi( ! checkWifi); } /** Sets Wi-fi status + visual feedback */ private void setWifi(boolean onoff){ tvWifi.setCompoundDrawablesWithIntrinsicBounds( onoff ? IC_WIFI_ON : IC_WIFI_OFF, 0, 0, 0 ); tvWifi.setTextColor( onoff ? getResources().getColor(COLOR_ON) : getResources().getColor(COLOR_OFF)); // process.. enable or not WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifi.setWifiEnabled(onoff); } //... @Override protected void onPause() { super.onPause(); // save checkWifi flag in db //... } //...
Мы можем сделать что-то подобное для любого количества полей:
Обратите внимание, что мы использовали View.onClickListener при определении onClick () в макете XML. Вместо этого мы могли бы использовать View.OnTouchListener :
// Activity now implements View.OnTouchListener @Override public void onCreate(Bundle savedInstanceState) { //... tvWifi.setOnTouchListener(this); } //... @Override public boolean onTouch(View v, MotionEvent event) { // handle event here ... return true; }
В чем разница между OnClick и onTouch ? Немного в этом конкретном случае использования, так как нам не нужны дополнительные причудливые вещи, которые мы могли бы сделать с onTouch и MotionEvent s.
Эта техника — просто альтернативный способ для включения / выключения. Мы также могли бы легко улучшить его с помощью некоторой анимации. Является ли это «лучше» или нет, чем обычные выключатели, в основном вопрос вкуса. Это своего рода «нестандартный» (что бы это ни значило), но, с другой стороны, он может дать дизайнерам больше свободы и возможностей для создания собственных оригинальных интерфейсов.
Happy Coding !