
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.62] |
![]() |
|
Сообщ.
#1
,
|
|
|
Привет всем андроидерам!
Продолжаю работу над тем же Android-приложением для заказа такси фирмы. Вчера дело дошло до промежуточных точек поездки. При нажатии на кнопку + перед конечной точкой маршрута в TableLayout добавляется промежуточная точка в виде TableRow с TextView для вывода ее буквенного индекса, View просто для отступа, AutocompleteTextView для ввода названия улицы и двумя EditText для задания номера дома и корпуса. При нажатии на кнопку - последняя промежуточная точка убирается. Вчера не успел предусмотреть код для востановления этих добавленных виджетов после поворота экрана, написал его сегодня утром. По сути, в onRestoreInstanceState() я практически дублирую код из обработчика нажатия кнопки +, только с той разницей, что добавляется сразу набор промежуточных точек и текст уже задан (хотя бы частично). Вот код части этой функции, отвечающей за восстановление виджетов для промежуточных точек: ![]() ![]() // Промежуточные точки int iPoints = savedInstanceState.getInt("intPoints"); if (iPoints > 0) { // Прочитаем массивы с адресами пром. точек String[] intObj = savedInstanceState.getStringArray("intObj"); String[] intHouse = savedInstanceState.getStringArray("intHouse"); String[] intCorp = savedInstanceState.getStringArray("intCorp"); // Кинем на форму for (int i = 0; i < iPoints; i++) { new AlertDialog.Builder(myApp) .setTitle("Ошибка") .setMessage(intObj[i]) .setPositiveButton(android.R.string.ok, null) .setCancelable(false) .create() .show(); TableRow tr = new TableRow(myApp); TextView tv = new TextView(myApp); tv.setText(indexes[intPoints.size()]); tr.addView(tv); View v = new View(myApp); v.setLayoutParams(new TableRow.LayoutParams(10, 10)); tr.addView(v); AutoCompleteTextView obj = new AutoCompleteTextView(myApp); obj.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 70f)); obj.setText(intObj[i]); obj.setSingleLine(); obj.setAdapter(adapter); obj.setTextColor(0x888888); //obj.setOnFocusChangeListener(focusListener); obj.setTag("obj"); tr.addView(obj); EditText house = new EditText(myApp); house.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 18f)); house.setText(intHouse[i]); house.setSingleLine(); house.setTextColor(0x888888); //house.setOnFocusChangeListener(focusListener); house.setTag("house"); tr.addView(house); EditText corp = new EditText(myApp); corp.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 12f)); corp.setText(intCorp[i]); corp.setSingleLine(); corp.setTextColor(0x888888); //corp.setOnFocusChangeListener(focusListener); corp.setTag("corp"); tr.addView(corp); orderForm.addView(tr, 6 + intPoints.size()); intPoints.add(tr); // Требуется вызвать фокус для всех добавленных полей, иначе не поставятся дефолтные значения house.requestFocus(); corp.requestFocus(); obj.requestFocus(); } bnAddIntPointMinus.setVisibility(View.VISIBLE); if (intPoints.size() == 7) bnAddIntPointPlus.setVisibility(View.INVISIBLE); tvTo.setText(indexes[intPoints.size()]); } Я здесь закоментировал навешивание обработчиков фокуса, так как по неизвестной мне причине на втором повороте приложение валится, с этим буду разбираться потом. Что сейчас не так - это то, что текст во всех этих восстановленных виджетах для ввода невидим! При этом при ландшафтной ориентации устройства Android же отображает немного по-другому при редактировании теста, скрывая форму и показывая широкое поле для ввода, так вот, в нем текст виден. Кроме того, можно увидеть в этом коде AlertDialog, вставленный для отладочных целей, так вот он выводит ранее введенное в поле значение, например, Невский, и так при кажом повороте. А на форме текста не видно, даже если попытаться туда его дописать. Как это исправить? Что нужно добавить в обработчик? Еще раз повторю, что тело цикла for практически полностью идентично тому коду, который выполняется при нажатии на кнопку +. Пробовал искать на эту тему информацию в интернете, к сожалению, пока ничего не нашел. Буду признателен за помощь. Сроки уже почти горят. К концу недели уже хотел базовый функционал приложения доделать, исключая только SMS-регистрацию и отправку на сервер идентификационных данных во всех запросах. Добавлено Кстати, есть ли способ как-то в Eclipse на эмуляторе делать поворот устройства, чтобы я мог это отлаживать прямо в среде? Я пока не разумею, почему на втором повороте приложение валится, знаю только, что это происходит только при привязывании обработчика фокуса, которое в приведенном коде закоментировано. Не хотелось бы потратить слишком много времени, пробуя разные варианты на телефоне, когда обычно я все ошибки отлаживаю на эмуляторе. Только вот с поворотом пока что не знаю как. |
Сообщ.
#2
,
|
|
|
Цитата Homez @ Кстати, есть ли способ как-то в Eclipse на эмуляторе делать поворот устройства, чтобы я мог это отлаживать прямо в среде? Ctrl+F12 |
Сообщ.
#3
,
|
|
|
О, за Ctrl+F12 - спасибо, работает! Теперь много времени себе сэкономлю. Ну вот только на основной вопрос так и нет ответа...
Добавлено Чувствую, что тут проблема какая-та самая элементарная, но никак не могу ни за что ухватиться. P.S. Когда в полях пользователь ничего не ввел, то там сереньким цветом отображается дефолтное значение-подсказка. Соответсвенно, пришлось написать обработчик постановки/снятия фокуса. Вот сейчас включил этот обработчик, когда значения в полях для промежуточных точек не заданы, то после поворота там остаются эти дефолтные значения! Вот это для меня уже мистика, ведь больше никакой текст не проходит. Добавлено В последнем случае, видимо, при чтении текста в этих полях срабатывает фокус, а в этом случае текст поля обнуляется. Для большей убежденности сейчас попробовал задать после поворота в одном из этих полей программно фиксированное значение, поле точно также портится. |