В этом посте описывается, как создать приложение погоды, используя рекомендации по дизайну материалов . Материальный дизайн — это набор правил для визуального дизайна, взаимодействия пользовательского интерфейса, движения и так далее. Эти правила помогают разработчикам при разработке и создании приложения для Android.
Темы охватывали
- Материальный дизайн
- Приложение Погода
- Панель инструментов Android
- Цвета материала Android
- Руководство по материалам Android
Этот пост хочет описать, как мы создаем приложение погоды, используя Weatherlib в качестве слоя погоды и правила дизайна материалов. Мы хотим разработать это приложение не только для Android 5 Lollipop, который изначально поддерживает дизайн материалов, но и для поддержки предыдущей версии Android, такой как 4.x Kitkat. По этой причине мы представим библиотеку appCompat v7, которая поможет нам реализовать Material Design даже в предыдущих версиях Android.
Мы хотим закодировать приложение, которое имеет расширенную панель инструментов, которая содержит некоторую информацию о местоположении и текущей погоде и некоторую основную информацию о погоде, такую как температура, значок погоды, влажность, ветер и давление. В конце мы получим что-то вроде картинки, показанной ниже:
Проект Android настроен
Первое, что нам нужно сделать, это настроить наш проект так, чтобы мы могли использовать Weatherlib и особенно appCompat v7. Мы можем открыть build.graddle и добавить эти строки:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.+' compile 'com.mcxiaoke.volley:library:1.0.6@aar' compile 'com.survivingwithandroid:weatherlib:1.5.3' compile 'com.survivingwithandroid:weatherlib_volleyclient:1.5.3' }
Теперь у нас есть правильно настроенный проект, и мы можем начать определять макет нашего приложения.
Макет приложения: дизайн материала
Как кратко объяснено ранее, мы хотим использовать панель инструментов в нашем случае расширенную панель инструментов . Toolbar это действие бар обобщение , которое дает нам больше контроля. В отличие от панели действий, которая тесно связана с Actvitiy, панель инструментов может быть размещена везде внутри иерархии представления.
Таким образом, наш макет будет разделен на три основные области:
- Область панели инструментов
- Значок погоды и температура
- Другие данные о погоде
Макет показан ниже:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".WeatherActivity" android:orientation="vertical"> <android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/my_toolbar" android:layout_height="128dp" app:popupTheme="@style/ActionBarPopupThemeOverlay" android:layout_width="match_parent" android:background="?attr/colorPrimary" android:paddingLeft="72dp" android:paddingBottom="16dp" android:gravity="bottom" app:titleTextAppearance="@style/Toolbartitle" app:subtitleTextAppearance="@style/ToolbarSubtitle" app:theme="@style/ThemeOverlay.AppCompat.Light" android:title="@string/location_placeholder" /> .... </RelativeLayout>
Как видите, мы использовали панель инструментов. Мы установили высоту панели инструментов равной 128dp, как указано в рекомендациях, и, кроме того, мы использовали основной цвет в качестве фона. Основной цвет определяется в colors.xml. Вы можете обратиться к руководству по цвету дизайна материала для получения дополнительной информации . Мы должны определить как минимум три разных цвета:
- Основной цвет, обозначенный 500
- Основной темный цвет обозначен 700
- Цвет акцента, который должен быть для кнопок основного действия и т. Д.
Цвет фона панели инструментов установлен на основной цвет.
<resources> <color name="primaryColor_500">#03a9f4</color> <color name="primaryDarkColor_700">#0288d1</color> .... </resources>
Кроме того, левый и нижний отступы внутри панели инструментов определяются в соответствии с указаниями. В конце мы добавляем пункты меню, как мы привыкли делать с панелью действий. Основной результат показан ниже:
Как видите, панель инструментов имеет фон, равный основному цвету.
Поиск города: Popup with Material Design
Мы можем использовать всплывающее окно, чтобы позволить пользователю ввести местоположение. Всплывающее окно очень простое, оно создается с помощью EditText, который используется для ввода данных, и простого ListView, который показывает город, соответствующий шаблону, вставленному в EditText. Я не буду рассказывать о том, как искать город в WeatherLib, потому что я уже рассказывал о нем. Результат показан здесь:
Макет всплывающего окна четко показан ниже:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/dialog.city.header" style="@style/Theme.AppCompat.Dialog"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8sp" android:text="@string/dialog.city.pattern"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:id="@+id/ptnEdit"/> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cityList" android:clickable="true"/> </LinearLayout>
Код для создания и обработки диалога показан ниже:
private Dialog createDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = this.getLayoutInflater(); View v = inflater.inflate(R.layout.select_city_dialog, null); builder.setView(v); EditText et = (EditText) v.findViewById(R.id.ptnEdit); .... et.addTextChangedListener(new TextWatcher() { .... @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (count > 3) { // We start searching weatherclient.searchCity(s.toString(), new WeatherClient.CityEventListener() { @Override public void onCityListRetrieved(List<City> cities) { CityAdapter ca = new CityAdapter(WeatherActivity.this, cities); cityListView.setAdapter(ca); } }); } } }); builder.setPositiveButton("Accept", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); // We update toolbar toolbar.setTitle(currentCity.getName() + "," + currentCity.getCountry()); // Start getting weather getWeather(); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); return builder.create(); }
Важно отметить, что в строке 33 мы устанавливаем заголовок панели инструментов в соответствии с городом, выбранным пользователем, а затем получаем текущую погоду. Результат этого куска кода показан здесь:
Weatherlib: погода
Для получения текущей погоды мы используем Weatherlib:
private void getWeather() { weatherclient.getCurrentCondition(new WeatherRequest(currentCity.getId()), new WeatherClient.WeatherEventListener() { @Override public void onWeatherRetrieved(CurrentWeather currentWeather) { // We have the current weather now // Update subtitle toolbar toolbar.setSubtitle(currentWeather.weather.currentCondition.getDescr()); tempView.setText(String.format("%.0f",currentWeather.weather.temperature.getTemp())); pressView.setText(String.valueOf(currentWeather.weather.currentCondition.getPressure())); windView.setText(String.valueOf(currentWeather.weather.wind.getSpeed())); humView.setText(String.valueOf(currentWeather.weather.currentCondition.getHumidity())); weatherIcon.setImageResource(WeatherIconMapper.getWeatherResource(currentWeather.weather.currentCondition.getIcon(), currentWeather.weather.currentCondition.getWeatherId())); setToolbarColor(currentWeather.weather.temperature.getTemp()); } .... }
Вы можете заметить, что в строке 8 мы устанавливаем субтитры панели инструментов в соответствии с текущей погодой, а в строке 15 мы меняем цвет панели инструментов в соответствии с текущей температурой. В качестве цвета фона панели инструментов мы использовали основные цвета, показанные в рекомендациях.