कैसे एक दृश्य में प्रोग्राम की शैली विशेषता निर्धारित करने के लिए


107

मुझे नीचे दिए गए कोड के साथ XML से एक दृश्य मिल रहा है:

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

मैं बटन के लिए एक "शैली" सेट करना चाहूंगा कि मैं जावा में ऐसा कैसे कर सकता हूं क्योंकि मैं प्रत्येक बटन के लिए कई शैली का उपयोग करना चाहता हूं।

जवाबों:


52

आम तौर पर आप प्रोग्राम को शैलियों में नहीं बदल सकते हैं; आप थीम या शैलियों का उपयोग करके अपने XML लेआउट में एक स्क्रीन, या एक लेआउट का हिस्सा या व्यक्तिगत बटन सेट कर सकते हैं । हालाँकि, थीम को प्रोग्रामेटिक रूप से लागू किया जा सकता है

इसमें एक ऐसी बात भी है, StateListDrawableजो आपको प्रत्येक राज्य के लिए अलग-अलग ड्राअब को परिभाषित करने देती है, जिसमें आपका Buttonध्यान केंद्रित, चयनित, दबाया, अक्षम और इतने पर हो सकता है।

उदाहरण के लिए, जब यह दबाया जाता है तो रंग बदलने के लिए आपका बटन पाने के लिए, आप एक XML फ़ाइल को परिभाषित कर सकते हैं जिसे res/drawable/my_button.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"


4
मेरी समस्या यह है कि मैं एक वेबबेस से डेटा लोड करता हूं जो मेरी बटन जानकारी का वर्णन करता है। बटनों को उनकी श्रेणी के आधार पर अलग शैली की आवश्यकता होती है। इसलिए मैं शैली को गतिशील रूप से सेट करना चाहूंगा।
Lint_

3
वैसे आप Android styleविशेषता को नहीं बदल सकते हैं , लेकिन आप प्रोग्राम Buttonको किसी अन्य दृश्य के साथ अपनी पसंद की पृष्ठभूमि सेट कर सकते हैं, यदि वह पर्याप्त होगा। इसके अलावा, एक Buttonविरासत के रूप में TextView, आप पाठ गुणों को बदल सकते हैं। इन आइटम्स के लिए बस API डॉक्यूमेंटेशन देखें ... developer.android.com/reference/android/view/…
क्रिस्टोफर ओर

मैं ऐसा करने के बारे में सोच रहा था, अगर मेरे पास नए जवाब थे तो जाँचने से ठीक पहले। बहुत बहुत धन्यवाद।

5
क्या एक बटन के लिए एक शैली बनाना संभव नहीं है जो पाठ आकार, मार्जिन आदि आदि को परिभाषित करता है और फिर इसे बटन पर प्रोग्रामेटिक रूप से लागू करता है। निश्चित रूप से इसका संभव कहना है कि क्या मेरे पास छह बटन हैं जो समान शैली चाहते हैं?
भालू

हम किस विशेषता को बढ़ा सकते हैं? क्या हम मार्जिन, पैडिंग को बढ़ा सकते हैं?
एंड्रॉइड मैन

49

सबसे पहले, आपको एक साधारण बटन बनाने के लिए एक लेआउट इनफ्लोटर का उपयोग करने की आवश्यकता नहीं है। आप बस उपयोग कर सकते हैं:

button = new Button(context);

यदि आप बटन को स्टाइल करना चाहते हैं तो आपके पास 2 विकल्प हैं: सबसे सरल एक है कोड के सभी तत्वों को निर्दिष्ट करना, जैसे कि अन्य उत्तर सुझाते हैं:

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

अन्य विकल्प एक्सएमएल में शैली को परिभाषित करना है, और इसे बटन पर लागू करना है। सामान्य स्थिति में, आप इसके लिए उपयोग कर सकते हैं ContextThemeWrapper:

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

टेक्स्ट-संबंधित विशेषताओं को टेक्स्ट व्यू (या बटन जैसे उप-वर्ग) पर बदलने के लिए एक विशेष विधि है:

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

यह पिछले सभी विशेषताओं को बदलने के लिए इस्तेमाल नहीं किया जा सकता है; उदाहरण के लिए पैडिंग बदलने के लिए आपको एक का उपयोग करने की आवश्यकता है ContextThemeWrapper। लेकिन टेक्स्ट कलर, साइज़ आदि के लिए आप इस्तेमाल कर सकते हैं setTextAppearance


1
बस शानदार। ContextThemeWrapper - क्या मैं इतने लंबे समय से देख रहा था।
बजे अयाज अलिफोव

यह काल्पनिक रूप से काम करता है। थोड़ी देर के लिए इस समाधान के लिए देख रहे हैं।
jasonjwwilliams

14

हां, आप एक बटन में उदाहरण के लिए उपयोग कर सकते हैं

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

5
वह पृष्ठभूमि सेट करेगा लेकिन एक शैली केवल एक पृष्ठभूमि से अधिक निर्दिष्ट कर सकती है। बहुत सारे व्यूज (बटन सहित) में एक कंस्ट्रक्टर लगता है जो एक पैरामीटर के रूप में एक स्टाइल आईडी लेता है। हालाँकि, मुझे यह समस्या हो रही है कि मेरे लिए काम करना है - बटन बिना किसी सीमा या किसी चीज़ के पाठ के रूप में दिखता है। इसके बजाय मैं क्या कर सकता हूं, इसमें केवल एक बटन के साथ एक लेआउट बनाया गया है (निर्दिष्ट शैली के साथ), उस लेआउट को फुलाएं, फिर बटन टेक्स्ट और व्हाट्सएप सेट करें।
स्पाकार्की 21

11

आप शैली विशेषताओं को इस तरह कर सकते हैं:

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"

    />

7
एक बटन पर विचार अच्छा जवाब बनाया जाएगा। यह देखना अच्छा होगा कि मौजूदा बटन के लिए यह कैसे करना है।
गुणवत्ता उत्प्रेरक

जवाब cesards से देखें।
क्रिस्टी वेल्श

10

यदि आप समर्थन लाइब्रेरी का उपयोग कर रहे हैं, तो आप बस उपयोग कर सकते हैं

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

TextViews और बटन के लिए। बाकी दृश्यों के लिए समान कक्षाएं हैं :-)


इस शैली को प्राप्त करने के लिए आपको किस R पैकेज का उपयोग करने की आवश्यकता है?
htafoya

6

सामग्री उत्तर की तलाश में किसी के लिए भी इस SO पोस्ट को देखें: Android में सामग्री डिजाइन और AppCompat के साथ रंग बटन

मैंने बटन के डिफ़ॉल्ट पाठ रंग को अपने बटन के लिए सफेद करने के लिए इस उत्तर के संयोजन का उपयोग किया: 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_button सिर्फ एक नियमित हो सकता है Buttonयदि आप चाहें तो या एक AppCompat बटन हो सकता है - मैंने उपरोक्त कोड को दोनों प्रकार के बटन के साथ परीक्षण किया है और यह काम करता है।

EDIT: मैंने पाया कि प्री-लॉलीपॉप डिवाइस उपरोक्त कोड के साथ काम नहीं करते हैं। प्री-लॉलीपॉप उपकरणों के लिए समर्थन जोड़ने के तरीके पर इस पोस्ट को देखें: https://stackoverflow.com/a/30277424/475340

मूल रूप से ऐसा करें:

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);
}

6

इस बात पर निर्भर करता है कि आप किस शैली की विशेषताओं को बदलना चाहते हैं, आप पेरिस लाइब्रेरी का उपयोग कर सकते हैं:

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

बैकग्राउंड, पैडिंग, टेक्स्टसाइज़, टेक्स्टकॉलर आदि जैसी कई विशेषताओं का समर्थन किया जाता है।

अस्वीकरण: मैंने पुस्तकालय को लिखा।


5

@Dayerman और @h_rules द्वारा उत्तर सही है। कोड के साथ एक विस्तृत उदाहरण देने के लिए, ड्रा करने योग्य फ़ोल्डर में, एक xml फ़ाइल बनाएँ, जिसे बटन_डिस्सबल्ड। Xml कहा जाता है

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">   
 <solid android:color="@color/silver"/>
<corners
   android:bottomRightRadius="20dp"
   android:bottomLeftRadius="20dp"
   android:topLeftRadius="20dp"
   android:topRightRadius="20dp"/>
</shape>

फिर जावा में,

((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);

यह बटन की संपत्ति को अक्षम कर देगा और रंग को चांदी में सेट कर देगा।

[रंग को color.xml में इस प्रकार परिभाषित किया गया है:

<resources>

    <color name="silver">#C0C0C0</color>

</resources>

4
@ स्पेसर: सवाल यह बिल्कुल नहीं कहता। यह अस्पष्ट है कि शैली XML है या जावा में। यह केवल पूछता है कि प्रोग्राम को प्रोग्रामेटिक रूप से कैसे सेट किया जाए।
हार्वे

3

रनटाइम में, आप जानते हैं कि आप अपने बटन को किस शैली में चाहते हैं। तो पहले से, लेआउट फ़ोल्डर में xml में, आपके पास आवश्यक शैलियों के साथ बटन जाने के लिए सभी तैयार हो सकते हैं। इसलिए लेआउट फ़ोल्डर में, आपके पास एक फ़ाइल हो सकती है जिसका नाम: button_style_1.xml है। उस फ़ाइल की सामग्री इस तरह दिख सकती है:

<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/styleOneButton"
    style="@style/FirstStyle" />

यदि आप टुकड़ों के साथ काम कर रहे हैं, तो onCreateView में आप उस बटन को बढ़ाते हैं, जैसे:

Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);

जहां कंटेनर ViewGroup कंटेनर onCreateView विधि से जुड़ा होता है, जब आप अपना टुकड़ा बनाते समय ओवरराइड करते हैं।

ऐसे दो और बटन चाहिए? आप उन्हें इस तरह बनाएँ:

Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);

आप उन बटनों को कस्टमाइज़ कर सकते हैं:

secondFirstStyleBtn.setText("My Second");
thirdFirstStyleBtn.setText("My Third");

फिर आप अपने कस्टमाइज़्ड, स्टाइल किए गए बटनों को लेआउट कंटेनर में जोड़ते हैं जिन्हें आपने ऑनक्रिएट व्यू विधि में भी फुलाया था:

_stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer);

_stylizedButtonsContainer.addView(firstStyleBtn);
_stylizedButtonsContainer.addView(secondFirstStyleBtn);
_stylizedButtonsContainer.addView(thirdFirstStyleBtn);

और यही कारण है कि आप गतिशील बटन के साथ गतिशील रूप से काम कर सकते हैं।


0

मैंने धारक पैटर्न का उपयोग करके इसके लिए एक सहायक इंटरफ़ेस बनाया।

public interface StyleHolder<V extends View> {
    void applyStyle(V view);
}

अब हर शैली के लिए आप व्यावहारिक रूप से सिर्फ इंटरफ़ेस लागू करना चाहते हैं, उदाहरण के लिए:

public class ButtonStyleHolder implements StyleHolder<Button> {

    private final Drawable background;
    private final ColorStateList textColor;
    private final int textSize;

    public ButtonStyleHolder(Context context) {
        TypedArray ta = context.obtainStyledAttributes(R.style.button, R.styleable.ButtonStyleHolder);

        Resources resources = context.getResources();

        background = ta.getDrawable(ta.getIndex(R.styleable.ButtonStyleHolder_android_background));

        textColor = ta.getColorStateList(ta.getIndex(R.styleable.ButtonStyleHolder_android_textColor));

        textSize = ta.getDimensionPixelSize(
                ta.getIndex(R.styleable.ButtonStyleHolder_android_textSize),
                resources.getDimensionPixelSize(R.dimen.standard_text_size)
        );

        // Don't forget to recycle!
        ta.recycle();
    }

    @Override
    public void applyStyle(Button btn) {
        btn.setBackground(background);
        btn.setTextColor(textColor);
        btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
    }
}

अपने में एक शैली को घोषित करें attrs.xml, इस उदाहरण के लिए शैलीगत है:

<declare-styleable name="ButtonStyleHolder">
    <attr name="android:background" />
    <attr name="android:textSize" />
    <attr name="android:textColor" />
</declare-styleable>

यहाँ इस शैली को घोषित किया गया है styles.xml:

<style name="button">
    <item name="android:background">@drawable/button</item>
    <item name="android:textColor">@color/light_text_color</item>
    <item name="android:textSize">@dimen/standard_text_size</item>
</style>

और अंत में स्टाइल धारक का कार्यान्वयन:

Button btn = new Button(context);    
StyleHolder<Button> styleHolder = new ButtonStyleHolder(context);
styleHolder.applyStyle(btn);

मुझे यह बहुत मददगार लगा क्योंकि इसे आसानी से पुन: उपयोग किया जा सकता है और कोड को साफ और क्रियाशील रखता है, मैं इसे केवल एक स्थानीय चर के रूप में उपयोग करने की सलाह दूंगा ताकि हम सभी शैलियों को सेट करने के साथ कचरा संग्रहकर्ता को अपना काम करने की अनुमति दे सकें। ।


-1

मुझे हाल ही में इसी समस्या का सामना करना पड़ा। यहाँ है कि मैं इसे कैसे हल किया।

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <!-- This is the special two colors background START , after this LinearLayout, you can add all view that have it for main background-->
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:weightSum="2"

    android:background="#FFFFFF"
    android:orientation="horizontal"
    >

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#0000FF" />

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#F000F0" />
    </LinearLayout>
    <!-- This is the special two colors background END-->

   <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:gravity="center"
    android:text="This Text is centered with a special backgound,
    You can add as much elements as you want as child of this RelativeLayout"
    android:textColor="#FFFFFF"
    android:textSize="20sp" />
</RelativeLayout>
  • मैंने Android के साथ एक LinearLayout का उपयोग किया: weightSum = "2"
  • मैंने दो बाल तत्वों को दिया एंड्रॉइड: लेआउट_वेट = "1" (मैंने प्रत्येक 50% मूल स्थान (चौड़ाई और ऊंचाई) दी है)
  • और अंत में, मैंने अंतिम प्रभाव के लिए दो बाल तत्व को अलग-अलग पृष्ठभूमि के रंग दिए।

धन्यवाद !

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.