android 사용자 정의 View 및 Attr 스타일 스타일 스타일 스타일

하나.뷰의 주제 및 스타일 스타일 사용자 정의
선언:
안드로이드 개발에서 불가피하게 특정한 단추의 압력, 클릭, 초점 등 상태를 설정해야 한다. 보통 이런 문제에 대해 가장 원시적인 방식은 레이아웃 파일에서 직접 설정하는 것이다. 그러나 비교적 큰 프로젝트에 있어 이런 방식은 유지보수성이 좋지 않기 때문에 코드를 다시 사용하도록 해야 한다.Toggle Button, 라디오 Button, CheckBox, 스크롤 바 색상, Button 같은 컨트롤은 클릭할 때 상태 전환 전후 스타일이 다르다.
소개:
android 프로젝트에는 보통 세 개의 스타일 설정 자원 폴더가 있습니다
values
values-11
values-14
이 세 가지 서로 다른 플랫폼의 sdk 버전에 대응하는 양식은android 개발에서 호환되는 문제에 대해'최신api를 최신androidsdk에서 실행시켜야 한다'는 것은 매우 좋은 행위이다.
values 파일은 주로 테마 스타일을 설정하는 데 사용되며 권한은 플랫폼에 따라 세분화된다. 즉android4.x는values-14를먼저찾고values-11을찾고마지막으로values,android2.x 처음에values-11 마지막에values 찾기
이상은values의 설정 문제입니다. 일반적으로 스타일입니다.xml은 일반적으로 window와activity 테마와 스타일을 설정하는 데 사용되지만, 실제로는 스타일입니다.xml도 컨트롤의 전역 스타일을 설정할 수 있습니다.
다음은 명언이 있다.
가능한 한 주제 양식과 페이지 풍격을 통일시키고 알록달록한 것이 가장 못생긴 풍격이다.
예를 들다
style.xml-1
    <style name="text_red_20_blod">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">20.0sp</item>
        <item name="android:textColor">@color/red_text_color</item>
    </style>

이러한 한계성은 레이아웃 파일에 직접 설정한 것과 마찬가지로 많은 코드가 적고 중용성을 높였으며 일부 전역화만 했다고 할 수 있다.
style.xml-2
<style name="AppTheme" parent="android:Theme.Holo.Light">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">20.0sp</item>
        <item name="android:textColor">@color/red_text_color</item>
</style>

이런 일은 가장 전반적인 것이고 중용성을 높였다. 물론 그의 결점도 있다. 이 점은 피할 수 없다. 그러면 개발 과정에서 우리는 어떻게 선택할 것인가?
  • style.xml-1에서 스타일 변화가 가장 빈번한View 스타일입니다. 이렇게 하면layout 파일에 너무 많은 코드가 누적되는 것을 피할 수 있습니다. css 스타일처럼
  • style.xml-2는 전체적으로 비교적 통일된 View 스타일에 적용된다. 즉, 일부 View의 공통된 통일이다. 일반적으로 Toggle Button, Check Box, Button 등 View의 상태 전환 스타일은 같은 프로젝트에서 항상 변화 효과를 유지한다.즉, Toggle Button을 사용자 정의로 넣고 상태를 전환한 후에 다음에 Toggle Button 스타일을 다시 사용하면 지난번 스타일과 일치해야 한다는 것이다.
  • 충돌 문제, 스타일에서.xml-2에서 스타일을 사용합니다.xml-1의 내용을 어떻게 보일지 이 문제는 한마디로 "전면성이 낮을수록 제어 권한이 높다"는 뜻이다. 즉, 스타일.xml-1의 제어 권한이 스타일.xml-2보다 높기 때문에 특정한 컨트롤의view 스타일에 영향을 주는 스타일이 설정되면 스타일="@style/xxx"의 권한이 테마 권한보다 높다는 것이다
  • .
    둘.사용자 정의 Attr 스타일 스타일 및 읽기
    사용자 정의 속성을 가져오는 것은 일반적으로 사용자 정의 View 내부에서 가져오지만, 어떤 방식으로든 사용자 정의 View의 속성이든 테마의 스타일의 속성이든 외부 스타일에서 가져올 수 있습니다.
    사용자 정의 뷰가 아닌 외부 가져오기 방식이 복잡하기 때문에 잠시 생략하고 나중에 보충합니다.
    1. attr 사용자 정의
    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:android="http://schemas.android.com/apk/res/android">
        <attr name="theme_name" format="string|reference"/>
    </resources>

    2. attr를 설정합니다. 이 Attr는 일반적인 스타일이 아닌 Activity 테마에 있어야 합니다.
    <resources>
        <!-- Activity themes -->
        <style name="Theme.Base" parent="android:Theme.Holo.Light" >
        <item name="theme_name" >@string/theme_name_1</item>    
        </style>
    </resources>

    3. 획득, xml 통과
     <TextView
            android:id="@+id/show_tv"
            android:layout_width="match_parent"
            android:layout_height="200dip"
            android:text="?attr/theme_name"
            android:background="@android:color/darker_gray" />

    4. 획득, 코드 통과
    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,outValue, true);
    textView.setBackgroundResource(outValue.resourceId);

    데이터를 직접 설정하면 resourceId가 0입니다.
    <resources>
        <!-- Activity themes -->
        <style name="Theme.Base" parent="android:Theme.Holo.Light" >
        <item name="theme_name" >    </item>    
        </style>
    
    </resources>

    이때 우리의 데이터는 TypeValue를 사용할 수 있다.string 읽기
    TypedValue outValue = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,outValue, true);
    if(outValue.data==TypeValue.TYPE_STRING)
    {
    textView.setBackgroundResource(outValue.string);
    }

    5. 물론, 때로는 우리의 속성이 집합일 수도 있다
    이때는 TypedValue로 얻을 수 없고 TypeValued는 유형만 판단할 수 있기 때문에 다음과 같은 방식을 선택합니다
    5.1 xml에서 우리는 스타일 = "?attr/MyStyle"또는 스타일 = "?android:attr/actionBarStyle"방식으로 집합 스타일의
    5.2 코드에서 다음과 같이 밤을 가져옵니다.
    public int getTabContainerHeight()
        {
            TypedArray a = mContext.obtainStyledAttributes(null, android.support.v7.appcompat.R.styleable.ActionBar, android.support.v7.appcompat.R.attr.actionBarStyle, 0);
            int height = a.getLayoutDimension(android.support.v7.appcompat.R.styleable.ActionBar_height, 0);
            Resources r = mContext.getResources();
            if(!hasEmbeddedTabs())
                height = Math.min(height, r.getDimensionPixelSize(android.support.v7.appcompat.R.dimen.abc_action_bar_stacked_max_height));
            a.recycle();
            return height;
        }

    View 내부 검색 방법은 다음과 같습니다.
      private static Context themifyContext(Context context, AttributeSet attrs, int defStyleAttr)
        {
            TypedArray a = context.obtainStyledAttributes(attrs, android.support.v7.appcompat.R.styleable.Toolbar, android.support.v7.appcompat.R.attr.ActionBarStyle, 0);
            int themeId = a.getResourceId(android.support.v7.appcompat.R.styleable.Toolbar_theme, 0);
            if(themeId != 0)
                context = new ContextThemeWrapper(context, themeId);
            a.recycle();
            return context;
        }

    좋은 웹페이지 즐겨찾기