मैं प्रोग्रामेटिक रूप से कस्टम टाइटल बार पर बैकग्राउंड कलर ग्रेडिएंट कैसे सेट कर सकता हूं?


82

वहाँ कई ट्यूटोरियल हैं और एसओ पर सवाल हैं जो कस्टम टाइटल बार को लागू करते हैं। हालांकि, मेरे कस्टम टाइटल बार में बैकग्राउंड के लिए मेरे पास एक कस्टम ग्रेडिएंट है और मैं जानना चाहूंगा कि इसे अपने कोड में गतिशील रूप से कैसे सेट किया जाए।

यहाँ मेरा कस्टम टाइटल बार कहा जाता है:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.foo_layout);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar); 

और यह मेरा है custom_title_bar:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@layout/custom_title_bar_background_colors">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

जैसा कि आप देख सकते हैं, रैखिक लेआउट पर पृष्ठभूमि इस आदमी द्वारा परिभाषित की गई है:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient 
    android:startColor="#616261" 
    android:endColor="#131313"
    android:angle="270"
 />
<corners android:radius="0dp" />
</shape>

मैं क्या करना चाहूंगा उन ढाल रंगों को गतिशील रूप से मेरे कोड में सेट करें। मैं अपनी एक्सएमएल फ़ाइल में उन्हें हार्ड कोड नहीं देना चाहता हूं जैसे वे वर्तमान में हैं।

यदि आप एक पृष्ठभूमि ढाल स्थापित करने का एक बेहतर तरीका है, तो मैं सभी विचारों के लिए खुला हूं।

पहले ही, आपका बहुत धन्यवाद!!

जवाबों:


207

कोड में ऐसा करने के लिए, आप एक ग्रैडिएंटट्रैबल बनाते हैं।
कोण और रंग सेट करने का एकमात्र मौका कंस्ट्रक्टर में है। यदि आप रंग या कोण बदलना चाहते हैं, तो बस एक नया GradientDrawable बनाएं और इसे पृष्ठभूमि के रूप में सेट करें

    View layout = findViewById(R.id.mainlayout);

    GradientDrawable gd = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM,
            new int[] {0xFF616261,0xFF131313});
    gd.setCornerRadius(0f);

    layout.setBackgroundDrawable(gd);

इस काम के लिए, मैंने आपके मुख्य रेखीय लयआउट के लिए एक आईडी जोड़ी

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<ImageView   
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:src="@drawable/title_bar_logo"
              android:gravity="center_horizontal"
              android:paddingTop="0dip"/>

</LinearLayout>

और एक कस्टम टाइटल बार के रूप में इसका उपयोग करने के लिए

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title_bar);
    View title = getWindow().findViewById(R.id.mainlayout);
    title.setBackgroundDrawable(gd);

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

2
@ केंद्र से ग्रेडिएंट की उत्पत्ति का कोई तरीका है? इसके बजाय 'GradientDrawable.Orientation.TOP_BOTTOM?'
लुई इवांस

यह ठीक है, लेकिन अगर उपयोगकर्ता का एपीआई <16 क्या करना है?
चिह्नित करें

@ यह आपके प्रश्न का उत्तर है stackoverflow.com/a/11947755/3080016
हिनहारा

6
setBackgroundDrawable()के बाद से पदावनत किया गया है, मुझे लगता है, एपीआई 16। आपको setBackground()इसके बजाय / का उपयोग करना चाहिए । देखें stackoverflow.com/questions/27141279/…
प्रतिबंध-जियोइंजीनियरिंग

1

यदि स्वीकृत उत्तर काम नहीं कर रहा है, तो आप सेट करने का प्रयास कर सकते हैं foreground

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