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