Сегодня мы напишем достаточно простое android приложение, с помощью которого легко перенести любой тест на эту платформу:
Пользователю будет предоставлен выбор из 4 вариантов ответа, а при достижении определенного (прописывается в коде) числа вопросов, случайно извлекаемых из базы, будет выведена статистика - количество и процент правильных ответов. После этого счетчики вопросов обнулятся, и приложение начнет тест заново.
Сначала подготовим strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Quiz</string>
<string name="note1">You pick</string>
<string name="note2">right answers from</string>
<string name="note3">Your rating is</string>
</resources>Syhi-подсветка кода
<resources>
<string name="app_name">Quiz</string>
<string name="note1">You pick</string>
<string name="note2">right answers from</string>
<string name="note3">Your rating is</string>
</resources>Syhi-подсветка кода
В данном проекте мы не станем использовать xml layout для создания программного интерфейса, поэтому удалим setContentView(R.layout.main) из кода Java, а также сам файл main.xml.
Приложению нужен интерфейс, и мы создадим его программно. Для этого сначала надо создать вместилище для него - мы используем класс AbsoluteLayout. Его достоинство в том, что можно каждому виджету, помещенному в него, задавать координаты относительно верхнего левого угла (ось x направлена вправо, а y - вниз). Создадим такой Layout и пропишем его как интерфейс для Activity:
private AbsoluteLayout Abs;
public void onCreate(Bundle savedInstanceState) {
try{
Abs=new AbsoluteLayout(this);
setContentView(Abs);
}
catch(Exception e){
Toast.makeText(this, e+"", Toast.LENGTH_LONG).show();
}
}Syhi-подсветка кода
public void onCreate(Bundle savedInstanceState) {
try{
Abs=new AbsoluteLayout(this);
setContentView(Abs);
}
catch(Exception e){
Toast.makeText(this, e+"", Toast.LENGTH_LONG).show();
}
}Syhi-подсветка кода
Мы объявили поле класса, имеющее тип AbsoluteLayout, а затем создали его при входе в Activity. Обратите внимание на то, что эти действия обернуты в блок try-catch. Если в программе возникнет ошибка, то нам будет выведен Toast с ее причиной. В отсутствие этой обработки программа "ляжет" при возникновении исключения (exception).
Теперь создадим как поля класса следующие элементы интерфейса - кнопки: одну большую - для вопроса, и 4 поменьше - для вариантов ответа, а также 2 поля, хранящие размеры экрана. Кнопки для вариантов имеет смысл объединить в массив:
private Button Question;
private Button[] Answers=new Button[4];
private double width;
private double height;Syhi-подсветка кода
private Button[] Answers=new Button[4];
private double width;
private double height;Syhi-подсветка кода
У каждой кнопки должны быть параметры - их размеры и координаты, перед помещением на Layout. Поэтому их следует им присвоить. Делается это с помощью класса LayoutParams, который ставят в соответствие виджету. Придется объявить массив из 5 объектов данного класса (для каждой кнопки). Но, поскольку, мы дальновидные люди, нужно создать константу, хранящую количество вариантов ответа - с этим программу будет наименее легко перестроить в случае надобности:
private static final int VARIANTS=4;
private AbsoluteLayout.LayoutParams[] params=new AbsoluteLayout.LayoutParams[VARIANTS+1];Syhi-подсветка кода
private AbsoluteLayout.LayoutParams[] params=new AbsoluteLayout.LayoutParams[VARIANTS+1];Syhi-подсветка кода
Теперь надо определить размеры экрана приложения в onCreate:
Display display = getWindowManager().getDefaultDisplay();
width=display.getWidth();
height=display.getHeight();Syhi-подсветка кода
Здесь же просто инициализируем кнопку с вопросом, присвоим ей параметры и поместим на Layout:width=display.getWidth();
height=display.getHeight();Syhi-подсветка кода
Question= new Button(this);
params[0]=new AbsoluteLayout.LayoutParams(
(int)width,(int)height/4,0,0
);
Question.setLayoutParams(params[0]);
Abs.addView(Question);Syhi-подсветка кода
params[0]=new AbsoluteLayout.LayoutParams(
(int)width,(int)height/4,0,0
);
Question.setLayoutParams(params[0]);
Abs.addView(Question);Syhi-подсветка кода
Первый параметр во второй команде означает размер по ширине, второй - размер по высоте, третий - x верхнего левого угла, четвертый - его же y.
В цикле сделаем те же операции с другими кнопками:
for (int i=1;i<VARIANTS+1;i++){
int k=i%2;
int m;
if (i<3) m=1;
else{
m=2;
}
Answers[i-1]= new Button(this);
params[i]=new AbsoluteLayout.LayoutParams(
(int)width/2,(int)height/4,(int)(k*width/2),(int)(m*height/4)
);
Answers[i-1].setLayoutParams(params[i]);
Abs.addView(Answers[i-1]);
}Syhi-подсветка кода
int k=i%2;
int m;
if (i<3) m=1;
else{
m=2;
}
Answers[i-1]= new Button(this);
params[i]=new AbsoluteLayout.LayoutParams(
(int)width/2,(int)height/4,(int)(k*width/2),(int)(m*height/4)
);
Answers[i-1].setLayoutParams(params[i]);
Abs.addView(Answers[i-1]);
}Syhi-подсветка кода
Локальные переменные k и m определяют "ячейку" расположения кнопки, с их помощью мы определяем их координаты.
k определяет, четной ли является кнопка. Если i на итерации цикла делится на 2 без остатка, кнопка примыкает к правой границе, иначе - к левой.
m определяет, больше ли номер кнопки, чем 2. В этом случае кнопка находит свое местоположение внизу, иначе - в верхней части.
Запустим эмулятор и увидим, что все элементы программного интерфейса встали на свои места. Первая часть разработки завершена.
Скачать исходник всей программы можно здесь
Комментариев нет:
Отправить комментарий