EditText setText () устанавливает текст в нескольких представлениях EditText

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

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

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

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

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

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

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

Возможные причины: 1) Я получаю неправильное представление EditText, когда нахожуById: Но этого не может быть. Я изменил свой код, чтобы опубликовать идентификатор объекта для EditTextView. Я получаю IN A TEXTVIEW и получаю уникальные идентификаторы объектов. Отправляя тот же самый 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());


    }
};
5
задан akameswaran 31 December 2011 в 14:52
поделиться