2011-12-31 13 views
5

私は奇妙な動作に遭遇していますが、私はバグを疑いますが、おそらく私は何かを見落としています。ポストの最後にコードスニペット。 .xmlも投稿できますが、この問題を理解する必要はないと思います。EditText setText()は複数のEditTextビューにテキストを設定します

私は、プレーヤの数に基づいてTableLayoutsを追加する水平線形レイアウトを持っています。

テーブルレイアウトいくつかのフィールドを含む、のTextView、のEditText、ボタン等

Iは各TableLayoutを初期化するときに、私は(XML膨張を介して)のLinearLayoutに追加した後のフィールドをintialize。

ところで、EditTextフィールドは常に最新のプレイヤー情報で更新されます。私が知ることから、setTextの呼び出しはすべてのEditTextに渡されています。

私は親TableLayout(のTableRowがあるので、実際に祖父母にfindViewByIdを使用してのEditTextを見つけています。

のEditTextのidのは、木全体で一意ではありませんが、テーブルのレイアウトの観点からユニークである。

考えられる理由: 1)findByIdのときにEditText Viewが間違っています。これはできません。 EditTextViewのobjectIDをポストするようにコードを変更しました。私はTEXTVIEWを取得し、ユニークなオブジェクトIDを取得します。正確に同じmyEditText.toString()をEditTextにポストして、最後に使用したオブジェクトIDの繰り返し値を取得します。繰り返すには、フィールドがTextViewの場合は常に正確に同じfindViewロジックを使用し、EditTextであればいつでも "複数の" setTextビヘイビアを表示します。

2)フィールドをEditTextからxmlのTextViewに変更し、単に私のキャストを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スニペット - 物事が壊れる:

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


    } 
}; 

答えて

9

私は同様の問題があったが、値が複製されました。 EditTextが状態を保存していて、IDに基づいてそれを復元していることがわかりました。このプロセスは、すでにウィジェットで正しい値を設定した後に同じ値を入力していました。

私が見つけた解決策は、XMLのウィジェットエントリにandroid:saveEnabled="false"を設定することでした。

+0

あなたは私の日を救った!どうもありがとうございます –

1

Victorが言ったように、EditTextのテキストプロパティはIDに基づいて復元されます。 これはonRestoreInstanceStateで発生します。同じIDを持つ複数のEditTextがある場合、それらのすべてが設定されます。

もう1つの解決策は、Androidが設定した値を設定または上書きすることです。 これは、onResumeまたはonRestoreInstanceStateのいずれかで、super.onRestoreInstanceStateが呼び出された後です。 (アクティビティの場合、フラグメントはチェックされませんでした)

onCreateの値を設定するのが早すぎます。この場合、上書きされます。

関連する問題