Androidリソースファイルに保存されている文字列配列の詳細


リソースファイルに文字列配列を保存
androidエンジニアリングの/res/valuesフォルダにstringsがあることはよく知られています.xmlは、コードとレイアウトファイルで使用する文字列リソースを記録するために使用できます.だがstrings.xmlに記録されている文字列は互いに独立しており、関係なく、取得時にも名前に基づいて1つずつ取得するしかありません.複数の関連文字列、すなわち記録文字列配列が必要な場合、どのように実現すればよいのでしょうか.1つの方法は、複数の文字列を1つの区切り文字(例えば;つなぎ合わせる、コードの中でgetString()で文字列を取得した後、Stringを通過する.split()は、文字列配列に分割されます.この方法の欠点は明らかだ.
  • 文字列が長すぎてメンテナンスが困難
  • 重複または漏れが発生しやすい
  • 各文字列の意味について説明
  • が欠けている.
    実際にandroid sdk自体は文字列配列のリソースタイプをサポートしており、リソースファイルに文字列配列を直接保存できます.使用方法は以下の通りです.
  • /res/valuesフォルダの下にarraysを新規作成します.xml Androidは開発時に1つのタイプのリソースを1つの個別のファイルに保存することに慣れており、androidプロジェクトを作成する際にデフォルトで/res/valuesフォルダに4つのファイルを生成し、それぞれ4つのタイプのリソース(strings.xml文字列リソース;Color.xml顔色リソース;dimens.xml数値リソース;styles.xmlスタイルリソース)を保存するために使用されます.ただし、文字列配列を保存するためのリソースファイルは生成されないため、文字列配列を保存するために新しいリソースファイルを作成する必要があり、通常はarraysと命名する.xml.もちろん、必要に応じて任意のファイル名に名前を付けることもできます(androidリソースファイルを解析する場合、リソースのタイプはxmlのノード名のみに依存し、リソースファイル名とは何の関係もありません.実際にはstrings.xmlで色リソースを定義したり、Color.xmlで文字列リソースを定義したり、すべてのリソースを1つのファイルに定義したりすることができますが、習慣に従って、各タイプのリソースを対応付けて保存したほうがいいです.)も参照してください.
  • arrays.xmlで作成するリソースノードは、他のリソースファイルと同じ構造です.arrays.xmlの最外層はresourcesノードであり、内部はstring-arrayノードである.例として次のようになります.
    <resources>
        <string-array name="fruit_price">
            <item>1.5</item>
            <item>2.3</item>
            <item>5.8</item>
        </string-array>
    </resources>

  • リソースファイルに保存されている文字列配列の使用
    レイアウトファイルで文字列配列リソースを使用する
    レイアウトファイルでは、@array/リソースidを使用して文字列配列リソースにアクセスできます.たとえばListViewでは、レイアウトファイルにandroid:entriesプロパティを設定して、文字列配列リソースをデフォルト表示のリストコンテンツとして指定できます.
    コードで文字列配列リソースを使用する
    ActivityではgetResources()を使用できます.getStringArray(id)メソッドは、文字列配列リソースidに対応する文字列配列を取得する.このidに対応するリソースが見つからない場合はandroidが投げ出されます.content.res.Resources$NotFoundExceptionは、idに対応するリソースが見つかりますが、文字列配列にitemが構成されていない場合、lengthが0のString配列を返します.
    文字列配列リソースの説明を追加
    文字列配列リソースに明確な意味を持つ文字列が保存されていない場合は、使用時に混同されやすくなります.各itemに記述を追加し、各文字列の意味を記録することができます.文字列配列リソースに記述を追加する方法は、itemごとに属性を追加し、属性名を任意に取り、属性値に対応する記述を記入することです.Androidはxmlを解析する際に認識されていない属性を自動的に無視するので、この記述属性はxmlファイルを維持する人にのみ役立ち、プログラムの実行には何の影響もありません.例:
    <resources>
        <string-array name="fruit_price">
            <item description="apple">1.5</item>
            <item description="pear">2.3</item>
            <item description="banana">5.8</item>
        </string-array>
    </resources>

    文字列の問題のフォーマット
    Androidでは、リソースファイルに「The name is%s and the count is%d」などの複数のフォーマット文字列を直接保存することはできません(ただし、1つのフォーマット文字のみが可能です.例えば、「The name is%s」).したがって、文字列配列の一部の文字列にフォーマット文字がある場合は、xmlファイルに直接書くことはできません.解決策は、文字列の%がフォーマット文字列として使用される場合、%の後に数字と$記号を付けることができ、最初の%の後の数字は1であり、後の%の後の数字は前の%の後の数字に1を加えることができ、例えば、「The name is%1$s、the count is%2$d and the size is%3$f」である.%がフォーマット文字列としてではなく、通常の文字として使用される場合、リソースにformatted=「false」プロパティを追加できます.例:
    <resources>
        <string-array name="fruit_price" formatted="false">
            <item description="apple">     %d  %s</item>
            <item description="pear">    %d  %s</item>
            <item description="banana">     %d  %s</item>
        </string-array>
    </resources>

    注意:formatted=「false」プロパティは、文字列配列が存在するリソースidノードにのみ追加でき、itemノードには追加できません.文字列配列にformatted=「false」属性を追加すると、配列内のすべての文字列は解析時に%が通常文字として解析され、文字列配列内の文字列ごとにformatted属性を個別に設定することはできません(itemノードに追加されたformatted属性は無効です).
    <!--     -->
    <resources>
        <string-array name="fruit_price">
            <item description="apple" formatted="false">     %d  %s</item>
            <item description="pear" formatted="false">    %d  %s</item>
            <item description="banana" formatted="false">     %d  %s</item>
        </string-array>
    </resources>

    ハイフン-のwarning問題
    文字列配列リソースファイルに保存されている文字列にハイフン-(0の右の文字)が含まれている場合、warningが表示されます.warningの内容は「Replace」-「with an」en dash「character(-,&;#8211;)」です.androidは、文字列の-をen dashで置き換えることをお勧めします.ハイフン-の英語はhyphenで、表示効果ではen dashがhyphenよりやや長いため、androidは-の代わりにen dashを推奨し、より良い表示効果を得ることができます.en dashとhyphenの詳細な違いについてはhttp://www.zhihu.com/question/20332423およびhttps://en.wikipedia.org/wiki/Dash. ハイフンを含む文字列が表示時にのみ使用される場合は、warningで提示された推奨事項、すなわち「-」(二重引用符を含まない)を使用して、ハイフン-の代わりに使用できます.文字列の比較、検索、正規一致、URLアドレスなど、ハイフンを含む文字列が他の用途に使用される場合は、ハイフンを置き換えることはできません.解決策は、このwarningを遮蔽し、リソースファイルの最外層resourcesノードにxmlns:tools=」を追加することです.http://schemas.android.com/tools」プロパティを選択し、warningをブロックする文字列に対応するitemにtools:ignore=「TypographyDashes」プロパティを追加します.例:
    <resources xmlns:tools="http://schemas.android.com/tools">
        <string-array name="phone_number">
            <item description="lili" tools:ignore="TypographyDashes">0551-25332991</item>
        </string-array>
    </resources>

    文字列配列内のすべてのアイテムのハイフンwarningをブロックする場合は、文字配列に対応するノードにtools:ignore=「TypographyDashes」プロパティを追加できます.たとえば、次のようにします.
    <resources xmlns:tools="http://schemas.android.com/tools">
        <string-array name="phone_number" tools:ignore="TypographyDashes">
            <item description="lili">0551-25332991</item>
        </string-array>
    </resources>

    リソースファイル全体の文字列のハイフンwarningをブロックする場合は、文字配列に対応するノードにtools:ignore=「TypographyDashes」プロパティを追加します.たとえば、次のようにします.
    <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyDashes">
        <string-array name="phone_number">
            <item description="lili">0551-25332991</item>
        </string-array>
    </resources>

    単一文字列のハイフンwarningをブロックするもう一つの方法は、文字列をに囲まれています.たとえば、次のようになります.
    <resources>
        <string-array name="phone_number">
            <item description="lili"><![CDATA[0551-25332991]]></item>
        </string-array>
    </resources>