2010-11-25 15 views
2

私はちょうどAndroid開発の楽しい世界に挑戦しましたが、私が取り組んでいるテストアプリでは非常に奇妙な問題がありました。アンドロイドの子コンポーネントでIDの重複を避けるにはどうすればよいですか?

このアプリケーションでは、各TableRowにEditTextといくつかのボタンが含まれているTableLayoutが使用されています。

TableRowsは、実行時に追加および削除できます。私が誤ってデバイスを傾けるまで、すべてが正常に動作しているように見えました。ディスプレイは応答してレイアウトを再配置しましたが、突然すべての値が各行で同じでした。

頭が傷ついた後、私は何が起こっているのか把握しました。オリエンテーションの変更により、Androidがアクティビティを再開していました。これが起こると、Androidはインスタンスの状態を保存して復元しようとしますが、コンポーネントIDに関連するデータを格納することでこれを行います。

私の場合、行はすべて同じレイアウトから作成されるため、すべての行のEditTextは同じIDを持ちます。結果は、私が知る限り、情報が保存されると、各行に上書きされるため、最後の行が優先されます。

復元時には、そのIDに関連付けられた値は1つだけなので、すべての行に適用されます。

私の場合は、とにかく値を保持する必要がないため、私はそれを回避することができました。私のonSaveInstanceStateでは、私はsuper.onSaveInstanceStateを呼び出さず、同様にonRestoreInstanceStateを呼び出します。

最後に私の質問に私をもたらします!

これらの個々の行の値を保存して復元するにはどうすればよいですか?再利用コンポーネント(私の場合はTableRow)に一意のIDを生成するための受け入れられた方法がありますか?

+0

あなたはこれに適した解決策を見つけましたか?私は同じ問題を抱えています。 –

+0

私が言ったように、私は実際に値を保持する必要はありませんでしたが、あなたの目標APIレベルに応じて、View.generateViewId()http://developer.androidを試すことができます。com/reference/android/view/View.html#generateViewId%28%29 – xtempore

答えて

0

JavaでTableRowsを生成し、View.setId()を使用できます。あなたはまた、XMLレイアウトファイルにテーブル行を置くかもしれない、Javaを介してロードする&は、IDを設定 - しかし、より難しいようです。

+0

また、タグ機能を思い出してください:http://developer.android.com/reference/android/view/View.html#findViewWithTag(java) lang.Object) - あなたの場合に役立つかもしれません。 –

+0

setIDがあったのかどうか疑問に思っていました。どのようにそれを使用しますか。 IDはintであり、通常は自動的に作成されるだけなので、コードで実行するときにどの数字を使用するべきかはわかりません。 – xtempore

1

私があなただったら、これはあなたのアプリが少ない安定させているため、私は、EditTextビューにyour_view.setId(your_new_id)を使用することはありません:別のビューがyour_new_idとまったく同じIDを持つように何が起こる場合?

私はあなたの_ view.setTag(some_unique_tag)を使用し、次にfindViewWithTag(some_unique_tag)を使用してEditTextビューを再度検索します。

findViewWithTag(some_unique_tag)はいずれもObjectとすることができます。私は個人的にはStringを好んでいます。記述的でユニークなタグを簡単に作成できるからです。

.setTagにタグが付いているのはViewです。

1

setIdに加えて、ViewクラスにgenerateViewIdメソッドがあります。それ以前のバージョンのものが必要ならば、ソースからコピーすることができます。

関連する問題