現在使用されているレイアウト ファイル名の名前を取得する方法は? たとえば、res/layout/main.xml などです。また、この情報を必要とするコードは、このレイアウトを含むアプリの一部ではなく、一種のテスト コードです。
2 に答える
リフレクションと多くの反復を使用できると思います。
最初に R.layout クラスにすべての静的が必要です。次に、それらの値を取得して と比較しView.getId()
、最後のステップでフィールド名を取得します。
main
ただし、横/縦モードなどで同じ名前のレイアウトが重複する可能性がある場合でも、名前にはレイアウトファイル名(例では)のみが含まれ、フルパスは含まれません
私はそのようなことを試したことはありません.テスト環境がエラーなしでRファイルにアクセスできるかどうかわからないので、これがうまくいくかどうかはわかりませんが、それがあなたが行くことができる方法です.
編集:仕事をするサンプルコードを追加するだけで、アプリ内から機能します-フレームワークとrへのアクセス方法がわからないと言ったように
R.layout layout = new R.layout();
Map<Integer, String> id2name = new HashMap<Integer, String>();
for (Field f : layout.getClass().getDeclaredFields()) {
try {
id2name.put(f.getInt(layout), f.getName());
Log.i("Layout", f.getInt(layout) + "," + f.getName());
}
catch (IllegalArgumentException e) {
//oops
Log.e("Layout", "", e);
}
catch (IllegalAccessException e) {
//oops
Log.e("Layout", "", e);
}
}
for (Entry<Integer, String> e:id2name.entrySet()) {
if (findViewById(e.getKey()) != null) {
Log.i("Layout:", "found: " + e.getValue() + ";" + e.getKey());
}else {
Log.i("Layout:", "not found: " + e.getValue()+ ";" + e.getKey());
}
}
レイアウトが完了しない限り、ビューは見つからないことに注意してください (早期に呼び出した場合、findViewById() は null です)。
もちろん、逆に、レイアウトが ViewGroup のインスタンスであるかどうかを確認してビュー ツリーを検索し、その子ビューを反復処理して、それぞれの ID をマップ内の ID と比較することもできます。
あなたはそうしない。内部的には、Android はファイル名ではなく、整数の id で参照します。生成された R ファイルで使用される整数を確認できます。そして、その情報は保存されず、適切なファイルを膨らませてから忘れます。