В этом посте описывается, как создать приложение погоды, используя рекомендации по дизайну материалов . Материальный дизайн — это набор правил для визуального дизайна, взаимодействия пользовательского интерфейса, движения и так далее. Эти правила помогают разработчикам при разработке и создании приложения для 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 мы меняем цвет панели инструментов в соответствии с текущей температурой. В качестве цвета фона панели инструментов мы использовали основные цвета, показанные в рекомендациях.


