Следующий простой шаг – вывод About; надо просто отреагировать на нажатие кнопки About показом нового окна с какой-то текстовкой, картинкий, урлами, номером версии и прочим.
Начать стоит с создания формы:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip">
<TextView
android:id="@+id/about_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/about_text" />
</ScrollView>Дальше надо сообщить приложению, что у него есть новая форма – это означает: надо в AndroidManifest.xml добавить соответствующую запись:
<activity android:name = ".About"
android:label = "@string/about_title"
android:theme = "@android:style/Theme.Dialog">
</activity>Для того, чтобы форма выглядела “красивее”, используется тема (смотреть доку здесь - C:/Program Files/eclipse/android-sdk-windows/docs/reference/android/R.style.html#Theme, ну это она у меня тут установлена конечно), вот разница между формами с использованием темы и без:
Ресурс для формы есть, надо создать файл About.java и настроить ее появление:
package org.example.sudoku;
import android.app.Activity;
import android.os.Bundle;
public class About extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
}
}Форма определена, внешний вид устраивает, приложение о ней в курсе – надо как-то ее показать. Для того, чтобы основная форма могла реагировать на событие “кнопка нажалась”, добавим в ее класс реализацию интерфейса OnClickListener (“Interface definition for a callback to be invoked when a view is clicked”), для этого в файле Sudoke.java меняем следующее: добавляем строки импорта соответствующих классов и добавляем в описание класса реализацию интерфейса OnClickListener. Короче, файл должен выглядеть после добавлений так:
package org.example.sudoku;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
// добавляем реализацию интерфейса OnClickListener
public class Sudoku extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// настраиваем кнопку About - сообщаем ей, что ее клики
// будет обрабатывать класс Sudoku
findViewById(R.id.exit_button).setOnClickListener(this);
// или более формально так:
View aboutButton = findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
// в R.id находится список идентификаторов наших ресурсов,
// например кнопки About, метод findViewById находит обьект по его
// идентификатору; обьявляется переменная типа View с именем
// aboutButton, которой и присваивается найденная по id кнопка
// затем вызывается метод setOnClickListener у кнопки, которому
// передается указатель на обьект, который должен реагировать на клики
// - в нашем случае this означает саму главную форму
// но ссылка на кнопку в общем ни для чего больше не нужна,
// так что можно использовать и первый вариант
}
@Override
public void onClick(View v) {
// это реализация интерфейса OnClickListener - у него согл. доке
// всего один абстрактный метод, который надо определить
// как только юзер кликнет по кнопку About приложение определит,
// что "слушает" клики для этого обьекта форма Sudoku и вызовет у нее метод
// onClick, передав ему указатель на кликнутый обьект
// остается только посмотреть, что за обьект нам сюда дали и выполнить
// для него какие-то действия
switch (v.getId()) {
case R.id.about_button:
// Intent (намерения) могут быть глобальными (типа "отсылка почты")
// или приватными (действующими внутри приложения)
// здесь - последнее
Intent i = new Intent(this, About.class);
// намерение здесь "однозначное" (Explicit) - получает класс,
// экземпляр которого хотим создать, а затем запускаем его
// (этот класс, в данном случае форму)
startActivity(i);
break;
case R.id.exit_button:
finish();
break;
}
}
}Ну теперь программа уже на что-то похожа – можно крутить телефон в руках, ориентация автоматически меняется, при начатии на About получаем окошко с описанием программы, при нажатии на Exit – выходим из игры
Как в настоящих играх при старте надо спросить об уровне сложности; для начала надо добавить текстовок (в strings.xml):
<string name="new_game_title">Difficulty</string> <string name="easy_label">Easy</string> <string name="medium_label">Medium</string> <string name="hard_label">Hard</string>
Дальше надо создать файл res/values/arrays.xml и добавить туда массив со значениями уровней сложности:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="difficulty">
<item>@string/easy_label</item>
<item>@string/medium_label</item>
<item>@string/hard_label</item>
</array>
</resources>Надо добавить обработчик для кнопки New Game, в котором будет вызываться функция openNewGameDialog, выглядит она так:
private void openNewGameDialog() {
new AlertDialog.Builder(this)
.setTitle(R.string.new_game_title)
.setItems(R.array.difficulty,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
startGame(i);
}
})
.show();
} Ненавижу тех, кто придумал такие языки – оно же совершенно не читабельно; в этой функции строится AlertDialog, заголовок которого берется из строкового ресурса new_game_title, а содержание – из массива; клики должен обрабатывать метод, который тут же обьявлен и реализован – параметра i (который является индексом выбранного значения в массиве) будет передан в функцию startGame, которая собственно начнет новую игру
private static final String TAG = "Sudoku" ;
private void startGame(int i) {
Log.d(TAG, "clicked on " + i);
// Start game etc...
}
Пока эта функция ничего не делает, кроме вывода в лог сообщения; лог можно увидеть, если пройтись по меню eclipse: Window –> Show View –> Other… –> Android –> LogCat:
Комментариев нет:
Отправить комментарий