Anekdot ANDROID CLUB 2015
Сегодня Navigation Drawer CardView Calligraphy TextToSpeech
Шаг 1: Создать проект Создавайте новый проект Activity – Navigation Drawer Activity
Шаг 2: Navigation Drawer Найдите res/menu/activity_main_drawer.xml Добавьте три элемента: 1. Aнекдоты 2. Афоризмы 3. Цитаты
Решение 2: Navigation Drawer
Шаг 3: updateContent() В MainActivity создавайте новый метод – updateContent Ничего не возвращает Принимает int type Показывайте type в тосте Вызывайте метод при запуске программы Вызывайте метод при выбора элемента в navigation drawer – Анекдоты (1), Афоризмы (4), Цитаты(5)
Решение 3: "StatementWithEmptyBody" public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id. nav_joke ) { updateContent(1); } else if (id == R.id. nav_aphorism ) { updateContent(4); } else if (id == R.id. nav_citation ) { updateContent(5); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id. drawer_layout ); drawer.closeDrawer(GravityCompat. START ); return true ; }
Шаг 4: Получить данные Добавьте разрешение: android.permission.INTERNET Добавьте библиотеку: compile 'com.loopj.android:android-async- В методе updateContent() получите данные c: [type] Кодировка данных - windows-1251
Решение 4: Получит данные public void updateContent( int type) { AsyncHttpClient client = new AsyncHttpClient(); String url = " + type; client.get(url, new AsyncHttpResponseHandler() public void onSuccess( int statusCode, Header[] headers, byte [] responseBody) { String json = null ; try { json = new String(responseBody, "windows-1251" ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } public void onFailure( int statusCode, Header[] headers, byte [] responseBody, Throwable error) { } }); }
Шаг 5: Лист Создавайте лист строк – contents Используя оператор цикла получите данные 10 раз Каждый раз добавьте содержание content в contents
Решение 5: Лист final ArrayList contents = new ArrayList<>(); for ( int i = 0; i < 10; i++) { client.get(url, new AsyncHttpResponseHandler() public void onSuccess( int statusCode, Header[] headers, byte [] responseBody) { String json = null ; try { json = new String(responseBody, "windows-1251" ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String[] parts = json.split( "\"" ); String content = parts[3]; contents.add(content); public void onFailure( int statusCode, Header[] headers, byte [] responseBody, Throwable error) { } }); }
Шаг 6: Layout Добавьте библиотеку: compile 'com.android.support:cardview-v7:23.1.0’ Создавайте layout: listitem_content Добавьте в listitem - android.support.v7.widget.CardView В CardView добавьте TextView - tvMyContent
Решение 6: Layout
Шаг 7: Adapter Создавайте новый класс – ContentsAdapter Наследник класса BaseAdapter Конструктор принимает Context context, ArrayList contents - и инициализирует context, contents В методе getView – установите значение в tvMyContent
Шаг 7: Adapter public class ContentsAdapter extends BaseAdapter { Context context ; ArrayList contents ; public ContentsAdapter(Context context, ArrayList contents) { this. context = context; this. contents = contents; public int getCount() { return contents.size(); public Object getItem( int position) { return contents.get(position); public long getItemId( int position) { return position; public View getView( int position, View convertView, ViewGroup parent) { View view = parent.inflate( context, R.layout. listitem_content, null ); TextView tvMyContent = (TextView) view.findViewById(R.id. tvMyContent ); String content = (String) getItem(position); tvMyContent.setText(content); return view; } }
Шаг 8: Показывать контент Добавьте ListView – lvContents в сontent_main Если после добавление контента в список, количество контента – 10 показывайте контент в lvContents
Решение 8: Показывать контент if (contents.size() == 10) { ListView lvContents = (ListView) findViewById(R.id. lvContents ); final ContentsAdapter adapter = new ContentsAdapter(MainActivity. this, contents); lvContents.setAdapter(adapter); }
Шаг 9: TextToSpeech MainActivity имплементирует TextToSpeech.OnInitListener Создавайте объект класса TextToSpeech - tts Имплементируйте метод onInit() В методе onInit проверьте status Если статус – TextToSpeech.SUCCESS то установите язык по умолчанию русским, если нет показывайте в тосте что ошибка Получите результат установки языка и проверьте Если резултать равно result LANG_MISSING_DATA или TextToSpeech. LANG_NOT_SUPPORTED, показывайте тост что язык не поддерживается При нажатии один из анекдотов, анекдот должен читаться
Решение 9: TextToSpeech public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, TextToSpeech.OnInitListener { private TextToSpeech mTTS public void onInit( int status) { // TODO Auto-generated method stub if (status == TextToSpeech. SUCCESS ) { Locale locale = new Locale( "ru" ); int result = mTTS.setLanguage(locale); //int result = mTTS.setLanguage(Locale.getDefault()); if (result == TextToSpeech. LANG_MISSING_DATA || result == TextToSpeech. LANG_NOT_SUPPORTED ) { Log.e( "TTS", "Извините, этот язык не поддерживается" ); } } else { Log.e( "TTS", "Ошибка!" ); } }
Шаг 10: Каллиграфия Добавьте библиотеку: compile 'uk.co.chrisjenx:calligraphy:2.1.0’ Перейдите в вкладку Project app/src/main -> New- >Folder->Assets Folder В папку assets добавьте папку fonts В папку fonts добавьте шрифт – RobotoLight.ttf В tvContent добавьте: fontPath="fonts/RobotoLight.ttf" tools:ignore="MissingPrefix"
Решение 10: Каллиграфия