web-dev-qa-db-ja.com

Androidでのres / values / public.xmlファイルの使用は何ですか?

Googleで検索しましたが、関連する結果が見つかりませんでした。

the official Android docsand ]this page (利用可能なすべてのリソース)がすべて見つかりました。関連リンクres/values/ディレクトリ)このページで見つけたのは:

これらのページは、res/values/public.xmlファイルについて何も伝えません。
ここにexampleこのタイプのファイルが見つかりました

スニペット

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="commentTextColor" id="0xAA010007" />
    <public type="drawable" name="add_icon_bl" id="0xAA020000" />
    <public type="layout" name="act_date_picker" id="0xAA030001" />
    <public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
    <public type="xml" name="pref_menu" id="0xAA050000" />
    <public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
    <public type="array" name="taskRepeat" id="0xAA070000" />
    <public type="color" name="theme_main_color_bl" id="0xAA080000" />
    <public type="string" name="no_internet" id="0xAA0a0001" />
    <public type="id" name="page1" id="0xAA0d0015" />
</resources>

type属性からわかるように、ほとんどのすべての標準リソースタイプ通常、separatedirectorysresディレクトリの下に置きます...


なぜAndroidが提供する単一のファイルを使用してすべての値を格納するディレクトリを誤用したいのでしょうか?

55
Igor Popov

ファイルres/values/public.xmlは、Androidリソースに固定リソースIDを割り当てるために使用されます。

res/values/strings.xmlのこれらの文字列リソースのセットを検討してください。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>

Android Asset Packaging Tool(aapt)は、アプリのコンパイル時にこれらのリソースに次のリソースIDを割り当てる場合があります。

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string3=0x7f040001;
    }
}

次に、文字列リソースのセットを

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string2">String 2</string>
    <string name="string3">String 3</string>
</resources>

@string/string3のリソースIDが変更されたことがわかります。

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040001;
        public static final int string3=0x7f040002; // New ID! Was 0x7f040001
    }
}

これを防ぐには、res/values/public.xmlを使用できます。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>

これにより、リソースIDが次のように割り当てられます。

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040002;
        public static final int string3=0x7f040001; // Resource ID from public.xml
    }
}

リソースに割り当てられたリソースIDは重要ではないため、アプリケーションがres/values/public.xmlを使用することはほとんどありません。変更されると、アプリケーション全体が再構築されるため、JavaリソースIDによるリソースへのコードの参照が更新されます。

res/values/public.xmlの最も重要なユーザーは、Androidプラットフォーム自体です。古いバージョンに対して構築されたアプリケーションof Androidは、特定のリソースに特定のリソースIDがあることを前提としています。たとえば、Android resource @Android:style/Theme は常にプラットフォームの古いバージョンに対して構築されたアプリとの下位互換性を確保するために、プラットフォームのリソースID 0x01030005があります。

リソースIDの割り当て方法の詳細について知りたい場合は、この回答を参照してください: AndroidリソースとリソースIDの間のマッピングはどのように機能しますか?

85

https://developer.Android.com/studio/projects/Android-library.html#PrivateResources

public.xmlは、一般的なライブラリプロジェクトに役立ちます。 public.xmlを含める場合、残りのリソースはプライベートであると想定されます。

プライベートリソースは他のプロジェクトで引き続き使用できますが、リンターはそれらの使用について警告し、AndroidStudioのオートコンプリートには含まれません。

ここにpublic.xmlを自動生成するための要点があります https://Gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba63

8
HannahMitt

シンボリック名とシステムリソースIDの間のマッピングを定義するのは、OSコードの使用作成者専用のファイルではありませんか?

これはSDKのYOUR_SDK_LOCATION\platforms\Android-??\data\res\valuesにあります。

向かっています

このファイルは、プラットフォームによってエクスポートされるベースパブリックリソースを定義します。これは常に存在する必要があります

警告があります:

このファイルを変更する人のための重要な注意事項は、変更を加える前に読んでください

このファイルは、リソースのバイナリ互換性を定義します。そのため、ここで変更を行う場合は非常に注意する必要があります。そうしないと、古いアプリケーションとの後方互換性が完全に失われます。

次のようなエントリがあります

<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />

その中で-すべてのシステムがIDを復活させるので、エントリを変更すると、標準デバイスでは実行されないため、コードを壊してしまいます。

3
NickT