0

現在使用されているレイアウト ファイル名の名前を取得する方法は? たとえば、res/layout/main.xml などです。また、この情報を必要とするコードは、このレイアウトを含むアプリの一部ではなく、一種のテスト コードです。

4

2 に答える 2

0

リフレクションと多くの反復を使用できると思います。

最初に 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 と比較することもできます。

于 2013-08-20T17:24:17.320 に答える
0

あなたはそうしない。内部的には、Android はファイル名ではなく、整数の id で参照します。生成された R ファイルで使用される整数を確認できます。そして、その情報は保存されず、適切なファイルを膨らませてから忘れます。

于 2013-08-20T15:53:53.867 に答える