2012-01-23 9 views
10

私は、固定レイアウトレイアウトとダイナミックレイアウトレイアウトでアクティビティを開発しています。動的パーツ(したがって、作成されたウィジェットの数とタイプ)は、次のようにデータベース値に基づいています。 すべてのデータベース行に対して、私はウィジェットのグループを持ちます。また、各グループのコンポーネントは、そのデータベース行のオブジェクト型(列の1つから決定)に依存します。ダイナミックレイアウトで自分のIDの安全な番号範囲は?

インスタンスの状態を保存/復元するには、すべてのウィジェットにIDが必要です。自分のIDが生成されたRクラスのIDと決して衝突しないようにしたいと思います。

アプリ内での操作性を向上させるには(どのウィジェットがどのデータオブジェクトのどのフィールドにマッピングするかを見つける)、ID = row * 100 + fieldindexのような番号付けスキームが役立ちます。 Fieldindexは正確に列番号ではありません。すべてのオブジェクトタイプには、独自のフィールドインデックスが必要です。

生成されたRのID値が連続した数を持たないように見えるため、RのIDプールを事前に定義するだけではなく、追加のマッピングを必要とせずにこれらを使用できます。 事前定義されたプールに対する第2の理由:フィールド指数の数が多いと、IDプールが大きくなります。第3に、IDプールのサイズは、表示可能な行数を制限します。

自分のレイアウトコンポーネントのIDに使用できる安全な番号の範囲はありますか? gen /フォルダ内のR.javaを見ると、生成されたIDがすべて0x7f000000より大きいという印象があります。それは保証されていますか? もしそうなら、0x00000000から0x7f000000まで自由に使用できる範囲か、またはAndroidの内部目的のために予約されていますか?

+0

ようこそ。良い質問です、よくある質問をお読みください。私たちは「ありがとう」を避けようとしており、署名は許可されていません。 – vidstige

+0

+1興味深い質問。 Androidは内部的に[0x1f onwards](http://developer.android.com/reference/android/R.id.html#addToDictionary)を使用し、projects/libsは0x7f以降を使用しているようです。 –

答えて

2

なぜ同じIDを避けたいですか?必要なものは、 An ID need not be unique throughout the entire tree, but it should be unique within the part of the tree you are searchingです。だから、あなたはあなたの式

IDを使用することができます=行* 100 + FieldIndexに

私はそれはプロジェクト内で一意でない場合であっても、正常に動作します。

+0

ああ、それは非常に興味深い情報です。しかし、私には分かりませんがまだ残っているものが1つあります:私は私のレイアウトを検索する唯一の人ではありません。 私がドキュメントを理解する限り、Androidはすべてのウィジェットの状態を一意のID(レイアウト全体で一意)で保存/復元します。 ID(ラベル、スペーサーなど)を割り当てずに定義したコンポーネントの内部IDがあるかどうかは不明です。 Androidは内部IDを割り当てていますか?はいの場合は、自分のIDと競合しないようにする必要があります。 –

+0

ビューのIDは次のように初期化されます。 'int mID = NO_ID;' NO_IDは-1で、このように保持されます。したがって、プログラムでコンポーネントを作成し、それにIDを割り当てない場合、idを持たない(したがって、その状態があれば、自動的に復元されない) – ChristophK