android - EditText setText() 在多个 EditText View 上设置文本

标签 android android-layout

我遇到了奇怪的行为,我怀疑是错误,但也许我忽略了一些东西。帖子末尾的代码 fragment 。我也可以发布 .xml,但我认为没有必要了解这个问题。

我有一个水平线性布局,我根据玩家数量添加了 TableLayouts。

表格布局包含几个字段,TextView、EditText、Buttons 等。

当我初始化每个 TableLayout 时,我将它添加到 LinearLayout(通过 xml 膨胀),然后初始化字段。

问题是,EditText 字段总是会更新最新的玩家信息。据我所知,我对 setText 的调用正在传递给每个 EditText。

我在父 TableLayout 上使用 findViewById 找到 EditText(实际上是祖 parent ,因为有一个 TableRow。

EditText id 在整个树中不是唯一的,但从表布局的角度来看是唯一的。

可能的原因: 1)当我找到错误的 EditText View 时:这不可能。我更改了我的代码以发布我在 TEXTVIEW 中获得的 EditTextView 的 objectID,并且我获得了唯一的对象 ID。将完全相同的 myEditText.toString() 发布到 EditText,我得到了上次使用的对象 ID 的重复值。重申一下,只要字段是 TextView,就可以使用完全相同的 findView 逻辑,只要它是 EditText,就会显示“多个”setText 行为。

2) 当我在 xml 中将字段从 EditText 更改为 TextView,然后简单地将我的转换从 EditText 更改为 TextView,一切都按预期运行。

3) 在我的 onClickListeners 中进行的类似查找尝试按预期运行。

4) 我已经尝试在初始化之前和之后将 View 添加到线性布局 - 相同的行为。我想知道这是否是底层对象的操作顺序,因为它适用于监听器,但我仍然遗漏了一些东西。

问题: 1)这对其他人来说看起来像个错误吗? 2) 建议的解决方法?
3) 知道为什么当我搜索我的顶级对象时它在我的听众中起作用,但在我的初始化代码中却不起作用,在那里我明确地拥有我的顶级对象(顶级对象是我膨胀的 TableLayout。

代码 fragment :

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());


    }
};

最佳答案

我有一个类似的问题,当设备改变方向时,值正在复制。我发现 EditText 正在保存它的状态并根据 id 恢复它。在我已经在小部件上设置了正确的值之后,这个过程填充了相同的值。

我找到的解决方案是在 XML 的小部件条目上设置 android:saveEnabled="false"

关于android - EditText setText() 在多个 EditText View 上设置文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688766/

相关文章:

android - AudioHardwareALSA::getInputBufferSize(...) 中的缓冲区计算

android - AndroidStudio库资源共享

android - 允许 TextView 在屏幕之外

android - 只需要为移动设备设置肖像

android - 如何使文本方向从右到左

android - 为什么 PendingIntent 不发回我的 Intent 自定义 Extras 设置?

Android无需人工交互即可连接WiFi

java - Android UI 中的相对位置

android - 在方向更改时更改 fragment 布局

android - 双向数据绑定(bind) : View is missing user defined type