web-gelistirme-sc.com

Android: program görünümünde görünüm stilini ayarla

İşte XML:

<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="@style/LightStyle"
    Android:layout_width="fill_parent"
    Android:layout_height="55dip"
    Android:clickable="true"
    Android:orientation="horizontal" >

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="horizontal" />

</RelativeLayout>

style niteliğini programlı olarak nasıl ayarlayabilirim? 

174
Jim

Teknik olarak, stilleri yine de özel görünümlerle programlı olarak uygulayabilirsiniz:

private MyRelativeLayout extends RelativeLayout {
  public MyRelativeLayout(Context context) {
     super(context, null, R.style.LightStyle);
  }
}

Bir argüman kurucu, görünümleri programlı olarak başlatırken kullanılandır.

Bu yüzden bu kurucuyu bir stil parametresi alan süper ile zincirleyin.

RelativeLayout someLayout = new MyRelativeLayout(context);

Ya da @Dori'nin basitçe işaret ettiği gibi:

RelativeLayout someLayout = new RelativeLayout(context, null, R.style.LightStyle);
169
Blundell

Benim için ne işe yaradı:

Button b = new Button(new ContextThemeWrapper(this, R.style.ButtonText), null, 0);
  • Bir ContextThemeWrapper kullanın

VE

  • 3 bağımsız değişken yapıcısını kullanın (bu olmadan çalışmaz)
96
Benjamin Piette

Yapamazsınız bir programın stilini henüz programlı olarak belirlersiniz, ancak bu konuyu faydalı bulabilirsiniz.

Update: Bu soruyu cevaplarken (2012 ortası, API seviyesi 14-15), görünümü programlı olarak ayarlamak bir seçenek değildi (önemsiz bazı geçici çözümler olsa da) daha yeni API sürümleri. Detaylar için @ Blundell'in cevabına bakınız.

84
Korhan Ozturk

Aşağıdakileri yaparak etkinliğinize bir stil uygulayabilirsiniz:

super.setTheme( R.style.MyAppTheme );

veya Android varsayılanı:

super.setTheme( Android.R.style.Theme );

faaliyetinizde, setContentView() işleminden önce.

9
FOMDeveloper

Yeni bir Button/TextView için:

Button mMyButton = new Button(new ContextThemeWrapper(this, R.style.button_disabled), null, 0);

Mevcut bir örnek için:

mMyButton.setTextAppearance(this, R.style.button_enabled);

Resim veya düzenler için:

Image mMyImage = new ImageView(new ContextThemeWrapper(context, R.style.article_image), null, 0);
7
Alon Kogan

Verilen cevapların hiçbiri doğru değil.

Stili programlı olarak ayarlayabilirsiniz. 

Kısa cevap/ http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/5.1.1_r1/Android/content/Context.Java#435’e bir göz atın.

Uzun cevap . İşte size programlanmış özel stil ayarlamak için benim snippet:

1) styles.xml dosyanızda bir stil oluşturun

 <style name="MyStyle">
    <item name="customTextColor">#39445B</item>
    <item name="customDividerColor">#8D5AA8</item>
</style>

Attrs.xml dosyasında özel niteliklerinizi tanımlamayı unutmayın

Attrsl.xml dosyam:

<declare-styleable name="CustomWidget">
    <attr name="customTextColor" format="color" />
    <attr name="customDividerColor" format="color" />
</declare-styleable>

Tarzınız için herhangi bir adı kullanabileceğinizi unutmayın (CustomWidget'im)

Şimdi stili programlama programına koymanıza izin veriyoruz. Programatic İşte Basit parçam:

public class StyleableWidget extends LinearLayout {

private final StyleLoader styleLoader = new StyleLoader();

private TextView textView;
private View divider;

public StyleableWidget(Context context) {
    super(context);
    init();
}

private void init() {
    inflate(getContext(), R.layout.widget_styleable, this);
    textView = (TextView) findViewById(R.id.text_view);
    divider = findViewById(R.id.divider);
    setOrientation(VERTICAL);
}

protected void apply(StyleLoader.StyleAttrs styleAttrs) {
    textView.setTextColor(styleAttrs.textColor);
    divider.setBackgroundColor(styleAttrs.dividerColor);
}

public void setStyle(@StyleRes int style) {
    apply(styleLoader.load(getContext(), style));
}
}

düzen:

<TextView
    Android:id="@+id/text_view"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textSize="22sp"
    Android:layout_gravity="center"
    Android:text="@string/styleble_title" />

<View
    Android:id="@+id/divider"
    Android:layout_width="match_parent"
    Android:layout_height="1dp"/>

</merge>

Ve sonunda StyleLoader sınıfı uygulaması

public class StyleLoader {

public StyleLoader() {

}

public static class StyleAttrs {
    public int textColor;
    public int dividerColor;
}

public StyleAttrs load(Context context, @StyleRes int styleResId) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.CustomWidget);
    return load(styledAttributes);
}

@NonNull
private StyleAttrs load(TypedArray styledAttributes) {
    StyleAttrs styleAttrs = new StyleAttrs();
    try {
        styleAttrs.textColor = styledAttributes.getColor(R.styleable.CustomWidget_customTextColor, 0);
        styleAttrs.dividerColor = styledAttributes.getColor(R.styleable.CustomWidget_customDividerColor, 0);
    } finally {
        styledAttributes.recycle();
    }
    return styleAttrs;
}
}

Tam çalışma örneğini https://github.com/Defuera/SetStylableProgramically adresinde bulabilirsiniz.

2
Defuera

XML kullanmaya devam etmek (kabul edilen yanıtın yapmanıza izin vermeyeceği) ve görünüm oluşturulduktan sonra stili ayarlamak isterseniz, mevcut tüm özelliklerin bir alt kümesini destekleyen Paris kütüphanesini kullanabilirsiniz.

Görünümünüzü XML'den şişirdiğinizden, mizanpajda bir kimlik belirtmeniz gerekir:

<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/my_styleable_relative_layout"
    style="@style/LightStyle"
    ...

Ardından, stili programlı olarak değiştirmeniz gerektiğinde, düzen şişirildikten sonra:

// Any way to get the view instance will do
RelativeLayout myView = findViewById(R.id.my_styleable_relative_layout);

// This will apply all the supported attribute values of the style
Paris.style(myView).apply(R.style.LightStyle);

Daha fazlası için: desteklenen görünüm türlerinin ve niteliklerinin listesi (arka plan, dolgu, kenar boşluğu vb. İle kolayca genişletilebilir) ve ek belgelerle kurulum talimatları .

Feragatname: Adı geçen kütüphanenin asıl yazarıyım.

1
Nathanael

ContextThemeWrapper'ı şu şekilde kullanmayı önermiyorum:

Belirtilen tema, temel bağlamdaki temanın üstüne uygulanacaktır.

Uygulamanızda istenmeyen sonuçlar neler olabilir. Bunun yerine airbnb adamlarından bunun için yeni bir paris kütüphanesi öneriyorum:

https://github.com/airbnb/paris

Program görünümünde Android görünümlerine stilleri tanımlayın ve uygulayın.

Ancak, bir süre kullandıktan sonra aslında oldukça kısıtlı olduğunu öğrendim ve kullanmayı bıraktım, çünkü kutudan çıkarmam gereken birçok özelliği desteklemediğim için, her zaman olduğu gibi kontrol etmek ve karar vermek zorunda kaldım.

1
Renetik

basit yol kurucudan geçiyor

RadioButton radioButton = new RadioButton(this,null,R.style.radiobutton_material_quiz);
0
saigopi

Bu benim basit örneğim, anahtar ContextThemeWrapper sargısıdır, onsuz, benim tarzım çalışmıyor ve Görünümün üç parametre yapıcısını kullanıyor.

ContextThemeWrapper themeContext = new ContextThemeWrapper(this, R.style.DefaultLabelStyle);
TextView tv = new TextView(themeContext, null, 0);
tv.setText("blah blah ...");
layout.addView(tv);
0
guogangj

Bileşik ViewGroup'umda XML'de tanımlanan görünümler kullandım, bunları Viewgroup'a ekledim. Bu yolla, stili dinamik olarak değiştiremiyorum, ancak bazı stil özelleştirmeleri yapabilirim. Kompozitim:

public class CalendarView extends LinearLayout {

private GridView mCalendarGrid;
private LinearLayout mActiveCalendars;

private CalendarAdapter calendarAdapter;

public CalendarView(Context context) {
    super(context);

}

public CalendarView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    init();
}

private void init() {
    mCalendarGrid = (GridView) findViewById(R.id.calendarContents);
    mCalendarGrid.setNumColumns(CalendarAdapter.NUM_COLS);

    calendarAdapter = new CalendarAdapter(getContext());
    mCalendarGrid.setAdapter(calendarAdapter);
    mActiveCalendars = (LinearLayout) findViewById(R.id.calendarFooter);
}

}

ve xml'deki görünümüm, stiller atayabildiğim yerde:

<com.mfitbs.Android.calendar.CalendarView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/calendar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:orientation="vertical"
>

<GridView
    Android:id="@+id/calendarContents"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />

<LinearLayout
    Android:id="@+id/calendarFooter"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    />

0
user3918502