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

