Пишем справочник

В этой статье я покажу как сделать простейшую программу Справочник про котов. На этом примере можно сделать огромное количество полезных приложений — например, небольшой сборник рецептов или набор схем оригами, если использовать ListView с миниатюрами.

Что мы узнаем:

  • Как сделать Splash-screen для программы
  • Как сделать простой список из массива, используя ListView
  • Как загрузить текст из ресурсов
  • Как загрузить html-текст в WebView
  • Как передать строку из одного Activity в другое
  • Как скрыть строку состояния и заголовок

План

После запуска приложения появляется Splash-картинка, потом она скрывается и остается список тем. После тапа на тему будет загружаться другое Activity с WebView, в который и будет загружаться тема из текстового файла. В этом Activity будут скрыты строка состояния и заголовок приложения.

Интерфейс

Создаем новый проект. Начнем с интерфейса программы. Откроем файл res\layout\main.xml. Удалим автоматически созданный TextView и вместо него добавим ImageView для отображения Splash картинки:


<ImageView
	android:id="@+id/splashscreen"
	android:src="@drawable/catlion"
	android:layout_height="fill_parent"
	android:layout_width="fill_parent"
	android:layout_gravity="center" />

Далее добавим ListView для отображения списка тем:


<ListView
	android:id="@+id/listView"
	android:layout_height="fill_parent"
	android:layout_width="fill_parent" />

Далее создадим второе окно Activity. Для этого создадим новый файл в каталоге layout и назовем его view.xml. Сюда мы добавим только WebView. Скрытие строки состояния и заголовка сделаем в Java-коде. Файл view.xml будет выглядеть так:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<WebView
		android:id="@+id/webView"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</LinearLayout>

Пишем код

В главном Activity будем показывать Splash-картинку и список заголовков. Открываем файл cribActivity.java:


package ru.alexanderklimov.crib;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class CribActivity extends Activity 
{
	private ListView lv1;
	private ImageView splash;
	private static final int STOPSPLASH = 0;
	private static final long SPLASHTIME = 2000; //Время показа Splash-картинки
	
	//Создаем массив разделов:
	private String lv_arr[]={
			"00. Начало",
			"01. Чем кормить кота.",
			"02. Как гладить кота.",
			"03. Как спит кот.",
			"04. Как играть с котом.", 
			"05. Как разговаривать с котом",
			"06. Интересные факты из жизни котов.",
			"07. Как назвать кота.",
			};
	
	private Handler splashHandler = new Handler() 
	{
		@Override
		public void handleMessage(Message msg) 
		{
			switch (msg.what) 
			{
			    case STOPSPLASH:
				    // убираем Splash картинку через изменение видимости
				    splash.setVisibility(View.GONE);
				    break;
			}
			super.handleMessage(msg);
		}
	};
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //получаем индентификатор ImageView с Splash картинкой
        splash = (ImageView) findViewById(R.id.splashscreen); 
        Message msg = new Message();
        msg.what = STOPSPLASH;
        splashHandler.sendMessageDelayed(msg, SPLASHTIME);
        
        // Получим идентификатор ListView
        lv1 = (ListView)findViewById(R.id.listView);
        //устанавливаем массив в ListView
        lv1.setAdapter(
        		new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr));
        lv1.setTextFilterEnabled(true);
              
        //Обрабатываем щелчки на элементах ListView:
        lv1.setOnItemClickListener(new OnItemClickListener() 
        {
        	public void onItemClick(AdapterView<?> a, View v, int position, long id) 
        	{
                //Позиция элемента, по которому щелкнули
                String itemname = new Integer(position).toString();  
                
                Intent intent = new Intent();
                
                intent.setClass(CribActivity.this, ViewActivity.class);
                
                Bundle b = new Bundle();
                
                //defStrID содержит строку, которую отправим через itemname в другое Activity
                b.putString("defStrID", itemname); 
                
                intent.putExtras(b);
                
                //запускаем Intent
                startActivity(intent);
             }
		});
    }
}

Второе Activity

Второе Activity содержит только WebView, которое будет отображать html-текст. Все картинки в тексте будут вставлены через data:uri. Текстовые файлы с именами n0.txt, n1.txt, n2.txt помещаем в новую директорию res/raw. В этом Activity мы скроем строку состояния и заголовок программно.

В моём примере картинки не используются. Пример вставки через data:uri смотрите в исходниках

Создадим новый файл в директории src и назовем его ViewActivity.java:


package ru.alexanderklimov.crib;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebView;

public class ViewActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        requestWindowFeature(Window.FEATURE_NO_TITLE); //скрываем заголовок
        
        setContentView(R.layout.view);
        
        //скрываем строку состояния
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        Bundle bundle = getIntent().getExtras();
        
		String itemname = "n" + bundle.getString("defStrID"); //получаем строку и формируем имя ресурса
		
		Context context = getBaseContext(); //получаем контекст
		
		//читаем текстовый файл из ресурсов по имени
		String text = readRawTextFile(context, getResources().getIdentifier(itemname, "raw", "ru.alexanderklimov.crib"));
		
        WebView myWebView = (WebView) findViewById(R.id.webView);
        String summary = "<!Doctype html><html><head><meta charset=utf-8></head><body>" + text + "</body></html>";
        myWebView.loadData(summary, "text/html", "utf-8"); //загружаем текст в webview
    }
    
    public static String readRawTextFile(Context ctx, int resId) //читаем текст из raw
    {
         InputStream inputStream = ctx.getResources().openRawResource(resId);

            InputStreamReader inputreader = new InputStreamReader(inputStream);
            BufferedReader buffreader = new BufferedReader(inputreader);
             String line;
             StringBuilder text = new StringBuilder();

             try {
               while (( line = buffreader.readLine()) != null) {
                   text.append(line);
                   text.append('\n');
                 }
           } catch (IOException e) {
               return null;
           }
             return text.toString();
    }
}

Манифест

Для того, чтобы программа работала, нужно настроить манифест. Кроме описания главного Activity, добавим описание второго Activity:


<activity
	android:name=".ViewActivity"
	android:label="Просмотр">
	<intent-filter>
		<action
			android:name=".ViewActivity" />
		<category
			android:name="android.intent.category.DEFAULT"></category>
	</intent-filter>
</activity>

Добавляем ресурсы

Теперь осталось импортировать ресурсы для нашей программы — Splash картинку и значок, их добавляем к другим ресурсам из директории drawable. Импорт реализуется через команду Import в контекстном меню Package Explorer или простым копированием файлов в этот каталог.

Работа с приложением

Теперь можно запустить проект в эмуляторе и убедиться, что все работает.

Эту программу также можно скачать в Android Market

Скачать программу

Скриншоты

Написано по мотивам Пишем шпаргалку на Android

Скачать оригинальный исходник