Я столкнулся со странным поведением, я подозреваю ошибку, но, возможно, я что-то упускаю. Фрагменты кода в конце сообщения. Я также могу опубликовать .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());
}
};