EditText setText () устанавливает текст в нескольких представлениях EditText - PullRequest
5 голосов
/ 31 декабря 2011

Я сталкиваюсь со странным поведением, я подозреваю ошибку, но, возможно, я что-то упускаю.Фрагменты кода в конце поста.Я также могу опубликовать .xml, но я не думаю, что это необходимо для понимания проблемы.

У меня горизонтальная линейная схема, к которой я добавляю TableLayouts в зависимости от количества игроков.

Макеты таблиц содержат несколько полей: TextView, EditText, Buttons и т. Д.

Когда я инициализирую каждый TableLayout, я добавляю его в LinearLayout (через xml-инфляцию) и затем инициализирую поля.

Дело в том, что поля EditText всегда обновляются с информацией о последних игроках.Из того, что я могу сказать, мой вызов setText передается каждому EditText.

Я нахожу EditText, используя findViewById для родительского TableLayout (на самом деле это дедушка, поскольку существует TableRow.

Идентификаторы EditText не уникальны во всем дереве, но уникальны с точки зрения разметки таблицы.

Возможные причины: 1) Я получаю неправильное представление EditText, когда нахожу: хотя это не может быть.Я изменил свой код, чтобы опубликовать objectID для EditTextView, который я получаю в текстовом виде, и я получаю уникальные идентификаторы объектов.Отправляя точно такой же myEditText.toString () в EditText, и я получаю повторяющееся значение последнего использованного идентификатора объекта.Повторяю, использование точно такой же логики findView работает всякий раз, когда поле является TextView, и отображает «множественное» поведение setText, когда оно представляет собой EditText.

2) Когда я изменяю поле с EditText на TextViewв xml, а затем просто измените мои приведения с EditText на TextView, все будет работать как положено.

3) Аналогичные попытки поиска, выполненные в моих onClickListeners, ведут себя как положено.

4)попытался добавить представление к линейному расположению до инициализации и после того же поведения.Мне было интересно, был ли это порядок операций для базовых объектов, поскольку он работал на слушателях, но я все еще что-то упускаю.

ВОПРОСЫ: 1) Это похоже на ошибку кому-либо еще?2) Предложенные обходные пути?
3) Любая идея, почему это работает в моих слушателях, когда я ищу свой объект верхнего уровня, но не в моем коде инициализации, где у меня явно есть объект верхнего уровня (объект верхнего уровня, являющийсяTableLayout, который я раздул.

КОДОВЫЕ ПОКРЫТИЯ:

onCreate Код инициализации:

TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, llayout, false);
InitializePlayer(player1,tl);
llayout.addView(tl);

InitializePlayer Snippet - где что-то ломается:

public void InitializePlayer(Player p, TableLayout tl)
{
    players.add(p);
    tl.setTag(p);
    //INITIALIZE LISTENERS HERE - SNIPPED FOR READABILITY

    TextView scoreLabel = (TextView)tl.findViewById(R.id.currentScore);
    EditText curPoints = (EditText)tl.findViewById(R.id.scoreEntry);
    curPoints.setText(p.getScore());


    EditText playerEntry = (EditText)tl.findViewById(R.id.playerName);
    playerEntry.setText(tl.toString());

    //CONFIRMING UNIQUE OBJECTS HERE should actually be p.getScore()
    scoreLabel.setText(playerEntry.toString());
    ListView lv = (ListView)tl.findViewById(R.id.listView);
    lv.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, p.getTurns() ));

OnClickCodeэто работает:

private OnClickListener addButtonListener = new OnClickListener() {
    public void onClick(View v) {
      // get all the objects I care about
        TableRow tr = (TableRow)v.getParent();
        TableLayout tl = (TableLayout)tr.getParent();
        EditText ev = (EditText)tl.findViewById(R.id.scoreEntry);
        Player pl = (Player)tl.getTag();

        TextView scoreLabel = (TextView)tl.findViewById(R.id.currentScore);

        pl.addScore(ev.getText().toString());
        scoreLabel.setText(pl.getScore());
        ListView lv = (ListView)tl.findViewById(R.id.listView);
        ArrayAdapter aa = (ArrayAdapter)lv.getAdapter();
        aa.notifyDataSetChanged();
        InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

        EditText playerEntry = (EditText)tl.findViewById(R.id.playerName);
        playerEntry.setText(playerEntry.toString());


    }
};

Ответы [ 2 ]

9 голосов
/ 13 июня 2012

У меня была похожая проблема, значения копировались, когда устройство меняло ориентацию. Я обнаружил, что EditText сохраняет свое состояние и восстанавливает его на основе идентификатора. Этот процесс заполнял те же значения после того, как я уже установил правильные значения для виджетов.

Решение, которое я нашел, состояло в том, чтобы установить android:saveEnabled="false" для записи виджета в XML.

1 голос
/ 13 декабря 2014

Как сказал Виктор: текстовое свойство EditText восстанавливается на основе идентификатора. Это происходит в onRestoreInstanceState. Если есть несколько EditTexts с одинаковым идентификатором, все они установлены.

Таким образом, другое решение - установить или перезаписать значения после того, как Android их установил. Это либо в onResume, либо в onRestoreInstanceState после вызова super.onRestoreInstanceState. (В случае действия. Я не проверял фрагменты)

Установка значений в onCreate слишком ранняя. Они будут перезаписаны в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...