На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> После поворота экрана не восстановить полностью несколько добавленных виджетов
    Привет всем андроидерам!

    Продолжаю работу над тем же Android-приложением для заказа такси фирмы. Вчера дело дошло до промежуточных точек поездки. При нажатии на кнопку + перед конечной точкой маршрута в TableLayout добавляется промежуточная точка в виде TableRow с TextView для вывода ее буквенного индекса, View просто для отступа, AutocompleteTextView для ввода названия улицы и двумя EditText для задания номера дома и корпуса. При нажатии на кнопку - последняя промежуточная точка убирается. Вчера не успел предусмотреть код для востановления этих добавленных виджетов после поворота экрана, написал его сегодня утром. По сути, в onRestoreInstanceState() я практически дублирую код из обработчика нажатия кнопки +, только с той разницей, что добавляется сразу набор промежуточных точек и текст уже задан (хотя бы частично). Вот код части этой функции, отвечающей за восстановление виджетов для промежуточных точек:

    ExpandedWrap disabled
      // Промежуточные точки
              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 на эмуляторе делать поворот устройства, чтобы я мог это отлаживать прямо в среде? Я пока не разумею, почему на втором повороте приложение валится, знаю только, что это происходит только при привязывании обработчика фокуса, которое в приведенном коде закоментировано. Не хотелось бы потратить слишком много времени, пробуя разные варианты на телефоне, когда обычно я все ошибки отлаживаю на эмуляторе. Только вот с поворотом пока что не знаю как.
      Цитата Homez @
      Кстати, есть ли способ как-то в Eclipse на эмуляторе делать поворот устройства, чтобы я мог это отлаживать прямо в среде?

      Ctrl+F12
        О, за Ctrl+F12 - спасибо, работает! Теперь много времени себе сэкономлю. Ну вот только на основной вопрос так и нет ответа...

        Добавлено
        Чувствую, что тут проблема какая-та самая элементарная, но никак не могу ни за что ухватиться.

        P.S. Когда в полях пользователь ничего не ввел, то там сереньким цветом отображается дефолтное значение-подсказка. Соответсвенно, пришлось написать обработчик постановки/снятия фокуса. Вот сейчас включил этот обработчик, когда значения в полях для промежуточных точек не заданы, то после поворота там остаются эти дефолтные значения! Вот это для меня уже мистика, ведь больше никакой текст не проходит.

        Добавлено
        В последнем случае, видимо, при чтении текста в этих полях срабатывает фокус, а в этом случае текст поля обнуляется.

        Для большей убежденности сейчас попробовал задать после поворота в одном из этих полей программно фиксированное значение, поле точно также портится.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0198 ]   [ 14 queries used ]   [ Generated: 17.07.25, 09:31 GMT ]