Translate

четверг, 1 сентября 2011 г.

Пишем приложение на android для создания тестов. Программное создание интерфейса


Сегодня мы напишем достаточно простое 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-подсветка кода

   В данном проекте мы не станем использовать 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-подсветка кода

   Мы объявили поле класса, имеющее тип AbsoluteLayout, а затем создали его при входе в Activity. Обратите внимание на то, что эти действия обернуты в блок try-catch. Если в программе возникнет ошибка, то нам будет выведен Toast с ее причиной. В отсутствие этой обработки программа "ляжет" при возникновении исключения (exception).
  
   Теперь создадим как поля класса следующие элементы интерфейса - кнопки: одну большую - для вопроса, и 4 поменьше - для вариантов ответа, а также 2 поля, хранящие размеры экрана. Кнопки для вариантов имеет смысл объединить в массив:
 
private Button Question;
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-подсветка кода

  Теперь надо определить размеры экрана приложения в onCreate:

Display display = getWindowManager().getDefaultDisplay();
width=display.getWidth();
height=display.getHeight();Syhi-подсветка кода
  Здесь же просто инициализируем кнопку с вопросом, присвоим ей параметры и поместим на Layout:


Question= new Button(this);
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-подсветка кода

  Локальные переменные k и m определяют "ячейку" расположения кнопки, с их помощью мы определяем их координаты.
  k определяет, четной ли является кнопка. Если i на итерации цикла делится на 2 без остатка, кнопка примыкает к правой границе, иначе - к левой.
 m определяет, больше ли номер кнопки, чем 2. В этом случае кнопка находит свое местоположение внизу, иначе - в верхней части.
 Запустим эмулятор и увидим, что все элементы программного интерфейса встали на свои места. Первая часть разработки завершена.


  Скачать исходник всей программы можно здесь

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...