뷰에서 프로그래밍 방식으로 스타일 속성을 설정하는 방법 버튼에 여러 스타일을

아래 코드를 사용하여 XML에서보기를 얻습니다.

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);

내가 사용할 각 버튼에 여러 스타일을 사용하기를 원하기 때문에 자바에서 어떻게 할 수있는 버튼에 대한 “스타일”을 설정하고 싶습니다.



답변

일반적으로 프로그래밍 방식으로 스타일을 변경할 수 없습니다. 테마 또는 스타일을 사용하여 XML 레이아웃의 화면 또는 레이아웃의 일부 또는 개별 버튼의 모양을 설정할 수 있습니다 . 그러나 테마는 프로그래밍 방식으로 적용 할 수 있습니다 .

또한 포커스, 선택, 눌림, 비활성화 등의 StateListDrawable각 상태에 대해 다른 드로어 블을 정의 할 수 있는 것과 같은 것이 Button있습니다.

예를 들어 버튼을 눌렀을 때 색상이 변경되도록하려면 다음 res/drawable/my_button.xml과 같이 directory 라는 XML 파일을 정의 할 수 있습니다 .

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:state_pressed="true"
    android:drawable="@drawable/btn_pressed" />
  <item
    android:state_pressed="false"
    android:drawable="@drawable/btn_normal" />
</selector>

그런 다음 Button속성을 설정 하여이 선택기를에 적용 할 수 있습니다 android:background="@drawable/my_button".


답변

우선, 간단한 Button을 만들기 위해 레이아웃 인플레이터를 사용할 필요가 없습니다. 다음을 사용할 수 있습니다.

button = new Button(context);

버튼의 스타일을 지정하려면 두 가지 선택이 있습니다. 가장 간단한 방법은 다른 많은 답변이 제안하는 것처럼 코드의 모든 요소를 ​​지정하는 것입니다.

button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);

다른 옵션은 XML로 스타일을 정의하고 단추에 적용하는 것입니다. 일반적인 경우에는 다음과 같이 사용할 수 있습니다 ContextThemeWrapper.

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);

TextView (또는 Button과 같은 하위 클래스)의 텍스트 관련 속성을 변경하려면 다음과 같은 특별한 방법이 있습니다.

button.setTextAppearance(context, R.style.MyTextStyle);

이 마지막 속성은 모든 속성을 변경하는 데 사용할 수 없습니다. 예를 들어 패딩을 변경하려면 ContextThemeWrapper. 그러나 텍스트 색상, 크기 등의 경우 setTextAppearance.


답변

예, 예를 들어 버튼에 사용할 수 있습니다.

Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);

답변

다음과 같이 스타일 속성을 수행 할 수 있습니다.

Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);

대신에:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    style="?android:attr/buttonBarButtonStyle"

    />

답변

지원 라이브러리를 사용하는 경우 간단히 사용할 수 있습니다.

TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);

TextViews 및 Buttons. 나머지 뷰에도 비슷한 클래스가 있습니다. 🙂


답변

Material 답변을 찾고있는 사람은이 SO 게시물을 참조하십시오 : Material Design 및 AppCompat을 사용하는 Android의 Coloring Buttons

이 답변의 조합을 사용하여 버튼의 기본 텍스트 색상을 흰색으로 설정했습니다.
https://stackoverflow.com/a/32238489/3075340

그런 다음이 답변 https://stackoverflow.com/a/34355919/3075340 프로그래밍 방식으로 배경색을 설정합니다. 그 코드는 다음과 같습니다.

ViewCompat.setBackgroundTintList(your_colored_button,
 ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));

your_colored_buttonButton원하는 경우 일반 또는 AppCompat 버튼 일 수 있습니다. 위의 코드를 두 가지 유형의 버튼으로 테스트했으며 작동합니다.

편집 : 사전 롤리팝 장치가 위의 코드에서 작동하지 않음을 발견했습니다. 사전 롤리팝 장치에 대한 지원을 추가하는 방법에 대한이 게시물을 참조하십시오. https://stackoverflow.com/a/30277424/3075340

기본적으로 다음을 수행하십시오.

Button b = (Button) findViewById(R.id.button);
ColorStateList c = ContextCompat.getColorStateList(mContext, R.color.your_custom_color;
Drawable d = b.getBackground();
if (b instanceof AppCompatButton) {
    // appcompat button replaces tint of its drawable background
    ((AppCompatButton)b).setSupportBackgroundTintList(c);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Lollipop button replaces tint of its drawable background
    // however it is not equal to d.setTintList(c)
    b.setBackgroundTintList(c);
} else {
    // this should only happen if 
    // * manually creating a Button instead of AppCompatButton
    // * LayoutInflater did not translate a Button to AppCompatButton
    d = DrawableCompat.wrap(d);
    DrawableCompat.setTintList(d, c);
    b.setBackgroundDrawable(d);
}

답변

변경하려는 스타일 속성에 따라 파리 라이브러리를 사용할 수 있습니다.

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Paris.style(view).apply(R.style.YourStyle);

background, padding, textSize, textColor 등과 같은 많은 속성이 지원됩니다.

면책 조항 : 나는 도서관을 작성했습니다.