Пишем простое приложение для Android: решение квадратного уравнения
Первая программа, которую мы самостоятельно напишем, будет простой, но ее написание позволит освоиться с основами разработки приложений для Android, а именно узнаем:
- Где располагаются основные файл проектов, и как с ними работать
- Как сделать простенький интерфейс для приложения
- Как осуществлять переходы между экранами приложения
- Как выводить текстовые данные
У каждой программы должна быть задача, для которой это программа создается, такая задача будет и у нашей программы – она будет решать квадратные уравнения. И прежде чем приступать к написанию программы нужно разобраться с поставленной задачей. Во-первых, напоминаю, что такое квадратное уравнение вообще:

Из первого уравнения становится ясно, что изменяемыми у нас будут 3 параметра – a, b, c. Все остальное – расчет, формирование данных для вывода и сам вывод результата – будет зависеть от них, поэтому мы окажем им особое внимание. Во-вторых, сразу оговорим требования к приложению, их будет немного:
- Главный экран, с которого будет производиться его запуск
- Прием данных пользователя на специальном экране
- Расчет уравнения по нажатию на кнопку (с проверкой введенных данных)
- Вывод результата в читабельном формате
Теперь можно приступать к написанию программы, отталкиваться будем от озвученных требований. Создаем новый или редактируем старый Android проект и начинаем. Я назвал свой проект equation.
Требование 1: Главный экран, с кнопкой запуска
Первый класс, который создает для нас Eclipse – дочерний класс Activity. Activity можно охарактеризовать просто как рабочее окно или рабочий экран (более точно и подробно). Это нам собственно и было нужно. Код созданного файла:
package ru.wert1go.equation;
import android.app.Activity;
import android.os.Bundle;
public class EquationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
- package – имя пакета
- import – импорт всех необходимых для работы приложения пакетов. Как узнать какой пакет вам нужен? Это можно либо знать, либо узнавать, когда Eclipse подчеркивает красным что-либо – в этом случае всплывающая подсказка пояснит чего не хватает, или что нужно делать. Для новичков Eclipse сильно облегчает жизнь: все необходимые пакеты импортируются нажатием – Ctrl + Shift + O, советую это запомнить.
- EquationActivity – название класса
- onCreate – метод, который вызывает при запуске приложения (подробнее)
- setContentView – метод подгружающий интерфейс приложения
- R.layout.main – переменная, которая дает знать методу, что именно подгружать
У каждого приложения на ОС Android существует класс R, в котором хранятся закодированные ссылки на данные приложения (подробнее), обращаясь к классу подобным образом layout.main мы говорим приложению что-то вроде:
“Эй, посмотри у нас там, на складе, в папке layout лежит бумажка с надписью main”
На деле все обстоит примерно так же: приложение обращается к “складу” – папке res, затем заходит в папку layout – где хранятся xml макеты приложения, и затем загружает файл main.xml

Чтобы увидеть его следуем в Package Explorer по следующему пути:
название вашего проекта -> res -> layout -> main.xml
Затем слева внизу переключаемся с графического вида (в нем пока нет необходимости) на xml вид. Сразу же исправим содержимое файла на необходимое нам (напомню, нужна кнопка). Теперь он будет выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="20dip"
android:paddingRight="20dip" >
<Button
android:id="@+id/start"
android:text="@string/start_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
Разметка приложения напоминает разметку сайта, тем кто с ней знаком освоится с разметкой интерфейса будет очень просто. Давайте разбираться.
RelativeLayout – макет с относительным позиционированием, то есть положение элементов макета определяется отношением между ними (подробнее).
Например: Блок 2 расположен под Блок 1, для этого нужно указать атрибут: android:layout_below = “Блок 1″
Таблица атрибутов RelativeLayout
| Атрибут | Значение |
| xmlns:android | Объявление пространства имен XML, этот атрибут необходимо указывать у внешнего тега |
| android:layout_width | Ширина макета, можно указывать в различных величинах, а можно воспользоваться двумя функциональными значениями: fill_parent – занять все доступное место в родительском теге (в нашем случае занять пространство шириною в экран), wrap_content – занять место эквивалентное размеру содержимого |
| android:layout_height | Аналогично ширине |
| android:orientation | Ориентация макета, вертикальная или горизонтальная (т.е. колонка или строка) |
| android:paddingLeft | Установка поля, т.е. расстояния от края экрана (в данном случае левого края) до содержимого |
Button – тег создающий нужную нам кнопку Таблица атрибутов Button
| Атрибут | Значение |
| android:id | Объявление id элемента, с его помощью будем обращаться к элементу из программы |
| android:text | Текс, который будет написан на кнопке. Строка @string/start_button |
| android:layout_centerInParent | Атрибут, указывающий, что наш элемент будет находится в центре родительского элемента |
Параметры размеров кнопки (layout_width, layout_height см в предыдущей таблице). XML макет готов, но Eclipse будет настойчиво сигналить об ошибке, и не спроста.
В макете мы прописали значение атрибута android:text = “@string/start_button”. Этой строкой мы говорим макету, где лежит текст, который будет написан на кнопке. Макет конечно же прекрасно знает, где это место, но нужного ему текста там нет. В Package Explorer открываем:
res -> values -> strings.xml
По открытию переходим на вкладку strings.xml в левом нижнем углу. Здесь хранятся все текстовые данные программы. Это очень удобно, ведь если мы будем использовать одну и ту же строку в нескольких местах, и нам вдруг захочется ее изменить, то изменять нам ее прийдется лишь единожды в файле strings.xml Думаю здесь все ясно:
- string – тег, в котором хранится текст
- name – атрибут string, содержимое которого является идентификатором строки, то есть если нам потребуется строка, то мы будем обращаться к ней по ее имени.
Строчку с name=”hello” можно удалить (именно она выводилась в нашем Hello World), и нужно добавить текст для кнопки, содержимое файла станет таким:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, EquationActivity!</string>
<string name="app_name">Equation</string>
</resources>
Сохраняем изменения, и возвращаемся в файл main.xml, теперь он не сигнализирует об ошибках и мы можем посмотреть как он будет выглядеть, для этого нужно переключиться на вкладку GaphicLayout, с которой мы благополучно сбежали в самом начале. С макетом покончено.Теперь нужно заставить кнопку работать.
На минутку вспомним требования, исходя из них у нас должно быть два рабочих экрана, то есть два дочерних класса Activity, и чтобы наша кнопка могла работать нужен второй экран, хотя бы пустой, который будет открываться по нажатию. Поэтому давайте создадим новый класс, переходим
File -> New -> Class
В поле Name вводим, например App и нажимаем Finish. После этого заменяем содержимое файла App.java содержимым нашего первого файла, затем исправляем имя класса с EquationActivity на App. Создадим так же для класса xml макет:
File -> New -> Android XML File
Задаем какое-нибудь имя файла, я предлагаю app, и сохраняем его. В файле App.java исправляем R.layout.main на R.layout.имя_файла_который_вы_только_что_создали.
Все забываем про эти файлы, на какое-то время. Вернемся к EquationActivity. Самое время рассказать программе о кнопке – для этого обновим метод onCreate:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View mStartButton = findViewById(R.id.start);
mStartButton.setOnClickListener(this);
}
Две новые строчки выделены. В первой мы создаем объект класса View под названием mStartButton (все элементы интерфейса программ для Android являются объектами View), затем мы определяем его как ссылку на кнопку.
Для этого используется метод findViewById (если дословно то: Найти объект типа View по id) с параметром R.id.start – при создании кнопки мы указывали ее id, именно по этому id мы к ней обращаемся, при помощи все того же класса R и приставки id.
Второй строкой мы прикрепляем к кнопке слушатель setOnClickListener – метод, который будет ожидать нажатия на кнопку. Не забываем нажимать Ctrl + Shift + O для импорта нужных пакетов. Eclipse начнет сигнализировать о неполадках, и будет прав.
Для работы слушателя нужно подключить интерфейс onClickListener и переопределить предоставляемый им метод onClick, который и будет откликаться на нажатие кнопки. Звучит страшно, но на деле ничего сложного:
...
public class EquationActivity extends Activity implements OnClickListener{
...
@Override
public void onClick(View view) {
} ...
Осталось совсем немного! Нужно переопределить метод onClick – этот метод будет срабатывать при каждом нажатии на кнопку.
Необходимо сделать так, чтобы он открывал новый экран, а именно экран описываемый файлом App.java. В этом нам поможет компонент приложения – Intent (переводится как намерение).
Intent – структура данных, содержащая абстрактное описание операций к выполнению. Если не поняли про абстрактное, то пока это и не нужно, важно понять что это элемент для задания каких-либо действий и передачи данных между Activity, т.е. рабочими экранами приложения.
Финальный вид класса EquationActivity.java:
package ru.wert1go.equation;
package ru.wert1go.equation;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class EquationActivity extends Activity implements OnClickListener{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Регистрируем кнопку (сначала создаем ее в main.xml) и добавляем listener
View mStartButton = findViewById(R.id.start);
mStartButton.setOnClickListener(this);
}
//Переопределяем функцию для рекции на нажатие кнопки
@Override
public void onClick(View view) {
Intent intent = new Intent(this, App.class);
startActivity(intent);
}
}
Снова было добавлено две строки. В первой мы создаем экземпляр класса Intent, и передаем ему два параметра this – указатель на текущий класс, и App.class – указатель на класс, к которому необходимо перейти. Сам переход осуществляется второй строкой, при помощи метода startActivity, которому в качестве параметра передается объект intent (помните, он есть структура данных).
Казалось бы все, можно запускать приложение. Но нет, если сделать это прямо сейчас, то по нажатии на кнопку программа выдаст ошибку.
Дело в том, что она не знает, что класс, к которому мы обращаемся, есть activity, которую можно запустить. Сейчас же нужно исправить это. Для этого откроем файл AndroidManifest.xml (не забудьте переключиться на просмотр xml внизу экрана) здесь много тегов и их атрибутов, в дальнейших статьях, по мере необходимости мы будем к ним обращаться, а пока найдем закрывающийся тег </activity> и вставим сразу после него следующее:
- android:label – название программы, которое будет красоваться вверху экрана (в strings.xml можете по играться с названием)
- android:name – имя дочернего класса Activity, записывается именно с точкой впереди (либо указывается полное название пакета), без расширения
Обратите внимание на содержимое первого тега activity, это описание первого класса, в моем случае EquationActivity (подробнее о Manifest).
Сохраняем файл, переходим во вкладку первого класса и запускаем приложение. Если вы сделали все без ошибок, то по запуску приложения у вас появится черный экран с кнопкой, после нажатия на которую откроется просто черный экран:

Давайте теперь реализуем это на практике. Для этого проследуем в ранее созданный app.xml – файл разметки второго экрана приложения. Удаляем все его содержимое и копируем или вводим следующий код:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="20dip"
android:paddingRight="20dip"
>
<LinearLayout
android:id="@+id/equation"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
>
<EditText
android:id="@+id/a"
android:hint="1"
android:inputType="numberSigned"
android:layout_width="40dip"
android:layout_height="wrap_content"
/>
<TextView
android:text="@string/xqudratic_text"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/b"
android:hint="0"
android:inputType="numberSigned"
android:layout_width="40dip"
android:layout_height="wrap_content"
/>
<TextView
android:text="@string/x_text"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/c"
android:hint="0"
android:inputType="numberSigned"
android:layout_width="40dip"
android:layout_height="wrap_content"
/>
<TextView
android:text="@string/equal_text"
android:textSize="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</RelativeLayout>
Вы уже немного знакомы с xml разметкой приложений, поэтому вам не составит труда опознать тег RelativeLayout, а так же большинство атрибутов этого и новых тегов. Новые теги:
- LinearLayout – макет с линейным позиционированием элементов, то есть элементы будут идти друг за другом (по горизонтали или вертикали, напомню, зависит от атрибута android:orientation)
- EditText – поле для ввода и редактирования символьных данных
- TextView – поле для выводя символьных данных
Таблица новых атрибутов
| Атрибут | Значение |
| android:hint | Текст подсказка, исчезает как только пользователь начинает вводить данные |
| android:inputType | Определение типа вводимых данных. numberSigned – целые числа со знаками |
| android:textSize | Размер выводимого текста. Единица измерения dip (не зависимый от плотности пиксель) –величина, значение которой будет масштабироваться под размеры дисплея, то есть указывая ее мы избавляемся от необходимости подгонять интерфейс и тексты под великое множество дисплеев Android-девайсов. |
Вот как соотносятся xml теги и элементы интерфейса:

Возвращаемся к коду разметки и обращаем внимание на то, что у LinearLayout указан id (это на будущее), у TextView текст снова хранится в string.xml. Последнее означает, что нужно наведаться туда и добавить необходимые данные, а именно строки:
<string name="xqudratic_text">x² + </string>
<string name="x_text">x + </string>
<string name="equal_text"> = 0</string>
Теперь, сохраним разметку и загрузим приложение. По нажатию на кнопку у нас откроется уже не пустой экран:

Попробуйте ввести что-нибудь и вы убедитесь, что ничего кроме положительных и отрицательных чисел ввести не удастся.
Требование 3: Расчет уравнения по нажатию на кнопку и проверка введенных данных
Кнопки мы уже делать умеем, поэтому смело новую добавляем в app.xml, после тега </LinearLayout>:
<?xml version="1.0" encoding="utf-8"?>
<Button
android:id="@+id/start"
android:text="@string/start_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/> </RelativeLayout>
Здесь вам все должно быть знакомо, кроме одного атрибута. Хотя, если вы внимательно читали его я упоминал в качестве примера, повторюсь: android:layout_below=”@+id/equation” Говорит нам о том, что кнопка будет располагаться ниже элемента с id equation, а это наш LinearLayout. Текст для кнопки добавьте сами, вы уже умеете. Переходим к файлу App.java. Здесь нам необходимо:
- Объявить классу о существовании кнопки и прикрепить к ней Listener
- Подключить интерфейс onClickListener и переопределить предоставляемый им метод onClick
- Объявить несколько переменных уровня класса:
- String mResult
- float D;
- float x1 = 0;
- float x2 =0;
Мы это уже делали раньше, сейчас есть только одно важное отличие – то, как мы переопределим метод onClick. Прежде чем заниматься решением этого вопроса предлагаю сразу определиться с необходимыми методами. Нам потребуются:
- метод вывода данных (showResult())
- метод расчета уравнения(solveEquation())
- метод подготовки выходных данных(getResult())
Исходя из этого списка мы уже можем переопределить метод onClick:
@Override public void onClick(View v) { showResult(); }
Теперь напишем метод showResult():
private void showResult() {
//Регистрируем поля для ввода данных
EditText mEditA = (EditText) findViewById(R.id.a);
EditText mEditB = (EditText) findViewById(R.id.b);
EditText mEditC = (EditText) findViewById(R.id.c);
//Получение введенных данных
String mA = mEditA.getText().toString();
String mB = mEditB.getText().toString();
String mC = mEditC.getText().toString();
//Получение подготовленного результата расчета
getResult(mA, mB, mC);
//Вывод данных
TextView mResultField = (TextView) findViewById(R.id.resultField);
mResultField.setText(Html.fromHtml(mResult));
}
Первым делом нам нужно зарегистрировать поля для ввода данных. Для этого мы создаем объект типа EditText и даем ему ссылку на поле данных при помощи функции findViewById, где id – это id EditText, которые мы добавляли в app.xml, на Java это записывается так:
EditText mEditA = (EditText) findViewById(R.id.a);
Буквы a, b, c соответствуют переменным уравнения. Следующий шаг это получение введенных данных. Для этого создается переменная типа String, и в нее сохраняется значение из поля EditText, предварительно преобразованное в String, на Java это выглядит так:
String mA = mEditA.getText().toString();
Теперь у нас есть данные, на основе которых мы можем получить результат, и мы передаем их методу getResult(). Метод getResult():
private void getResult(String a, String b, String c) {
//Объявление переменных
int mValueA;
int mValueB;
int mValueC;
//Проверяем были ли введенны данные вообще
if (a.length() == 0) {
a = "1";
mValueA = 1;
} else
mValueA = Integer.parseInt(a); //Достаем из строки число типа int
if (b.length() == 0) {
b = "0";
mValueB = 0;
} else
mValueB = Integer.parseInt(b);
if (c.length() == 0) {
c = "0";
mValueC = 0;
} else
mValueC = Integer.parseInt(c);
//Передаем числовые данные функции расчета уравнения
solveEquation(mValueA, mValueB, mValueC);
/*Собираем строку для вывода данных
* Подготовка основного уравнения
* a не должно равняться 0
*/
if (mValueA == 0)
mResult = 1 + "x2";
else
mResult = a + "x2";
if (mValueB < 0 )
mResult += b + "x";
else
mResult += "+" + b + "x";
if (mValueC < 0)
mResult += c + " = 0";
else
mResult += "+" + c + "= 0";
//Вывод уравнения расчета x1 и x2
mResult += "x1,x2 = (-(" + b + ")±√" + b + "2-4×"
+ a + "×" + c + ")/2×" + a + " = 0";
/*В зависимости от значения дискриминанта добавляем данные.
* D < 0 - строка c сообщением
* D > 0 - результаты расчета x1 и x2
*/
if (D < 0) {
mResult += "Уравнение не имеет решения, так как дискриминант меньше 0";
} else {
mResult += "x1 = -(" + b + ") + √" + D + " = " + x1 + "";
mResult += "x2 = -(" + b + ") - √" + D + " = " + x2 + "";
}
}
Метод в качестве входных параметров получает 3 переменные типа String. Затем проверяет не пустые ли они, если пустые устанавливаются значения по умолчанию (a = 1, b = 0, c = 0), если не пустые, то внутренним переменным метода присваиваются значения введенных чисел при помощи метода parseInt().
После того, как числовые данные были установлены они передаются методу solveEquation() (он очень прост и будет объяснен комментариями в коде).
После получения результатов начинаем готовить результаты для вывода. Я решил организовать вывод данных в виде строки, форматироваться, которая будет html разметкой. В сборке строки нам поможет оператор: +=
Сперва мы собираем строку самого уравнения с учетов введенных данных (при этом учитываем знаки чисел), затем собираем уравнение расчета, и в конце концов добавляем итоговый результат. Все специальные символы были выражены при помощи html.
Требование 4: Вывод результата в читабельном формате
После того, как данные были рассчитаны и собраны в строку и сохранены в переменной mResult, мы можем их вывести. Для этого, в методе showResult() предназначены две последние строки.
//Вывод данных
TextView mResultField = (TextView) findViewById(R.id.resultField);
mResultField.setText(Html.fromHtml(mResult));
Первая вам может показаться знакомой. Мы создаем экземпляр объекта TextView – mResultField, и даем ему ссылку на TextView с id resultField. TextView – поле для вывода символьных данных. Поэтому следуем в файл app.xml и ниже кнопки добавляем:
<TextView
android:id="@+id/resultField"
android:text=""
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/solve"
/>
Возвращаемся к последней строке метода showResult(). Здесь при помощи метода setText(Html.fromHtml(mResult)) мы заполняем атрибут android:text, а мы уже знаем, что текст от туда имеет свойство появлять на экране. Html.fromHtml указывает на то, что в тексте присутствуют html теги и их необходимо учитывать. Проверьте код класса App, он должен выглядеть так:
package ru.wert1go.equation;
import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
public class App extends Activity implements OnClickListener{
String mResult;
float D;
float x1 = 0;
float x2 = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app);
//Регистрируем кнопку
View mSolveButton = findViewById(R.id.solve);
mSolveButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
showResult();
}
private void showResult() {
//Регистрируем поля для ввода данных
EditText mEditA = (EditText) findViewById(R.id.a);
EditText mEditB = (EditText) findViewById(R.id.b);
EditText mEditC = (EditText) findViewById(R.id.c);
//Получение введенных данных
String mA = mEditA.getText().toString();
String mB = mEditB.getText().toString();
String mC = mEditC.getText().toString();
//Получение подготовленного результата расчета
getResult(mA, mB, mC);
//Вывод данных
TextView mResultField = (TextView) findViewById(R.id.resultField);
mResultField.setText(Html.fromHtml(mResult));
}
private void solveEquation(int a, int b, int c) {
//Расчет дискриминанта
D = (float) Math.pow(b, 2) - 4 * a * c;
//Если D < 0, то расчет не требуется
if (D >= 0) {
x1 = (float) ((-b + Math.sqrt(D))/2*a);
x2 = (float) ((-b - Math.sqrt(D))/2*a);
}
}
private void getResult(String a, String b, String c) {
//Объявление переменных
int mValueA;
int mValueB;
int mValueC;
//Проверяем были ли введенны данные вообще
if (a.length() == 0) {
a = "1";
mValueA = 1;
} else
mValueA = Integer.parseInt(a); //Достаем из строки число типа int
if (b.length() == 0) {
b = "0";
mValueB = 0;
} else
mValueB = Integer.parseInt(b);
if (c.length() == 0) {
c = "0";
mValueC = 0;
} else
mValueC = Integer.parseInt(c);
//Передаем числовые данные функции расчета уравнения
solveEquation(mValueA, mValueB, mValueC);
/*Собираем строку для вывода данных
* Подготовка основного уравнения
* a не должно равняться 0
*/
if (mValueA == 0)
mResult = 1 + "x2";
else
mResult = a + "x2";
if (mValueB < 0 )
mResult += b + "x";
else
mResult += "+" + b + "x";
if (mValueC < 0)
mResult += c + " = 0";
else
mResult += "+" + c + "= 0";
//Вывод уравнения расчета x1 и x2
mResult += "x1,x2 = (-(" + b + ")±√" + b + "2-4×"
+ a + "×" + c + ")/2×" + a + " = 0";
/*В зависимости от значения дискриминанта добавляем данные.
* D < 0 - строка c сообщением
* D > 0 - результаты расчета x1 и x2
*/
if (D < 0) {
mResult += "Уравнение не имеет решения, так как дискриминант меньше 0";
} else {
mResult += "x1 = -(" + b + ") + √" + D + " = " + x1 + "";
mResult += "x2 = -(" + b + ") - √" + D + " = " + x2 + "";
}
}
}
Сохраняем проект и загружаем наше приложение. Оно работает!

Скачать исходный код приложения или apk файл. Если найдете ошибку в посте или баг приложения пишите в комментарии.
Ноябрь 25th, 2011 at 19:23
[...] прошлый раз мы написали простую программу. Она спокойно запускается и работает на эмуляторе, но [...]
Декабрь 9th, 2011 at 15:06
Отличная статья. Только стоит уточнить:
“…а пока найдем закрывающийся тег и вставим сразу после него следующее…”
уточнить, что мы описываем новый activity, а не просто прописываем сразу после закрывающего тега android:label(кстати там опечатка, у вас написано :lable) и android:name
Декабрь 22nd, 2011 at 18:25
На этапе, когда должна вывалится кнопка и черный экран я надолго завис, потому что эмуль показывал кнопку, при нажатии на которую вываливалась еще одна кнопка а потом еще одна кнопка…цикл. А после полутора часов оказалось, что я создал класс не в своей папке, а в дефолтной…
Спасибо вам большое за подобный альтруизм)
Вроде почти даже совсем возможно и вышло…
Декабрь 25th, 2011 at 18:59
:)
Декабрь 25th, 2011 at 19:49
[...] (в зависимости от роли потерянных данных). Пример: приложение решения квадратных уравнений. Если вы осилили мануал, и получили приложение, то уже [...]
Февраль 3rd, 2012 at 12:31
Проблема в коде, на стадии приписывания Intent – в коде в общем должно быть 2 @Override, с первым все окей, а вот на второй еклипс ругается и постоянно предлагает его удалить – причем пробовал и сам писать.и тупо копировать код из этого гайда – все равно пишет что он типа как лишний. В итоге если его убирать, то приложение запускается, но при нажатии кнопки старт выкидывает с ошибкой. А с написанным оверрайдом не запускается потому что ругается на ошибки
Февраль 3rd, 2012 at 20:58
Проверь наличие интерфейса: implements OnClickListener
А в импорте посмотри тот ли импортируется, должно быть import android.view.View.OnClickListener; (Эклипс предлагает их два – второй для диалогов)
@Override должен присутствовать, ну или как минимум его присутствие не должно вызывать ошибки. Если ошибка появляется, это значит, что подобного метода нет в супер-классе.
Февраль 9th, 2012 at 5:50
За альтруизм – спасибо! Понимаю, что цель не решение квадратных уравнений, но
1)в коде, в формуле для поиска корней:(…)/2*а, а должно быть(…)/(2*а) иначе – везде, где а!=1 корни ищутся неверно
2)если, в а вбить 0 (а это технически возможно), никакой ошибки не выдается, выводятся нулевые корни.
либо ошибку -либо решение линейного надо.
3)по выводу на экран тоже – зачем выводить формулу для корней без деления на 2а? либо только результат -либо правильно.
По андроиду – все супер!Нету, правда, описания экспорта в Apk, или есть, но не нашла.