테마 종속 Android 문자열



Answers

네, 그렇게 할 수 있습니다. 그리고 방법은 다음과 같습니다 : 먼저 theme 속성을 정의해야합니다.

<attr name="myStringAttr" format="string|reference" />

그런 다음 테마에이 줄을 추가하십시오.

<item name="myStringAttr">Yarrrrr!</item>

또는

<item name="myStringAttr">@string/yarrrrr</item>

그런 다음 XML 파일에서이 속성을 사용할 수 있습니다 ( @ 대신 ? 표시).

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?attr/myStringAttr" />

또는 코드에서 다음과 같이하십시오.

public CharSequence resolveMyStringAttr(Context context) 
{
    Theme theme = context.getTheme();
    TypedValue value = new TypedValue();

    if (!theme.resolveAttribute(R.attr.myStringAttr, value, true)) {
        return null;
    }

    return value.string;
}
Question

남성과 여성이 주제가 두 가지 인 응용 프로그램이 있다고 가정 해 봅시다. 테마는 단순히 사용자가 선호하는 취향에 호소하기 위해 색상 팔레트와 몇 가지 드로어 블을 변경합니다.

http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html 에서 많은 도움을 주셔서 감사합니다.

그러나 이제는 앱으로 조금 더 귀여워지기를 원한다고 말하면서 색상과 드로어 블을 바꿀뿐만 아니라 줄을 바꾸기를 원합니다. 예를 들어, 해적 테마를 추가하고 "제출"이 "Arrrrgh"가 될 수 있습니다.

그래서, 내 기본적인 질문은 : 어떻게 응용 프로그램 내에서 사용자가 선택할 수있는 테마를 통해 문자열을 변경할 수 있습니까?

편집하다:

위로 만들기 : 응용 프로그램에는 12 개의 버튼과 32 개의 텍스트보기가 있습니다. 테마에 의존하고 싶습니다. 거대한 매핑이나 커스텀 attrs없이이 작업을 수행하고 싶습니다.

현재 솔루션 3 개 모두 작동합니다. 나는 그런 짐승이 있다는 것을 모릅니다.




그래, 실제로 유지 관리하고 코드 정리를 유지할 수있는 두 번째 옵션이 있지만 각 String에 대한 배열을로드하기 때문에 더 많은 리소스가 필요할 수 있습니다. 나는 그것을 벤치마킹하지 않았지만 그것을 다른 선택으로 제시 할 것이지만 너무 많은 테마 선택을 제공한다면 그것을 사용하지 않을 것이다.

public enum ThemeMode {
    NORMAL(0),
    PIRATE(1),
    NINJA(2);

    private int index;
    private ThemeMode(int index) {
        this.index = index;
    }

    public int getIndex() {
        return this.index;
    }
}
<resources>
    <!-- ALWAYS define strings in the correct order according to 
         the index values defined in the enum -->
    <string-array
        name="OK_ARRAY">
        <item>OK</item>
        <item>Yaarrrr!</item>
        <item>Hooaaaa!</item>
    </string-array>
    <string-array
        name="CANCEL_ARRAY">
        <item>Cancel</item>
        <item>Naarrrrr!</item>
        <item>Wha!</item>
    </string-array>
</resources>
public setButtonTexts(Context context, ThemeMode themeMode) {
    // buttons are instantiated elsewhere
    buttonOk.setText(context.getResources()
            .getStringArray(R.array.CANCEL_ARRAY)[themeMode.getIndex()]);
    buttonCancel.setText(context.getResources()
            .getStringArray(R.array.OK_ARRAY)[themeMode.getIndex()]);
}



Links