রঙিন মান প্রোগ্রাম করুন যখন এটি একটি রেফারেন্স (থিম) হয়


116

এই বিবেচনা:

styles.xml

<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
    <item name="theme_color">@color/theme_color_blue</item>
</style>

attrs.xml

<attr name="theme_color" format="reference" />

color.xml

<color name="theme_color_blue">#ff0071d3</color>

সুতরাং থিম রঙ থিম দ্বারা রেফারেন্স করা হয়। আমি কীভাবে থিম_রঙ (রেফারেন্স) প্রোগ্রাম্যাটিকভাবে পেতে পারি? সাধারণত আমি ব্যবহার করব getResources().getColor()তবে এই ক্ষেত্রে তা ব্যবহৃত হবে না কারণ এটি রেফারেন্সযুক্ত!

উত্তর:


254

এটি কাজ করা উচিত:

TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;

এই কোডটি কল করার আগে আপনার ক্রিয়াকলাপে থিমটি প্রয়োগ করার বিষয়টি নিশ্চিত করুন। হয় ব্যবহার:

android:theme="@style/Theme.BlueTheme"

আপনার প্রকাশ বা কল (আপনি কল করার আগে setContentView(int)):

setTheme(R.style.Theme_BlueTheme)

ভিতরে onCreate()

আমি এটি আপনার মানগুলির সাথে পরীক্ষা করেছি এবং এটি পুরোপুরি কার্যকর হয়েছে।


ধন্যবাদ আমি এখনও আপনার সমাধানটি চেষ্টা করতে পারছি না কারণ আমি একটি ত্রুটি পেয়েছি: stackoverflow.com/questions/17278244/… সম্ভবত আপনার এই অভিজ্ঞতা থাকতে পারে ...
সেরফিমের

5
(TypedValue {T = 0x0 / D = 0x0}) যাই হোক, আপনার সমাধান সঙ্গে আমি একটি 0 মান রঙ পেতে ... আমি ঘোষণা-styleable ব্যবহার করবেন না, রঙ মাত্র একটি রেফারেন্স
উচ্চতম শ্রেণীয় দেবদূত এর

আপনি কি আপনার কার্যকলাপে থিম প্রয়োগ করেন?
ইমানুয়েল মেকলিন

5
আপনি যদি ক্রিয়াকলাপে থিমটি প্রয়োগ করতে না চান, আপনি ContextThemeWrapperথিম আইডি ব্যবহার করে একটি তৈরি করতে পারেন এবং তারপরে থিমটি পুনরুদ্ধার করতে পারেন।
টেড হপ

1
এই পদ্ধতিটি অ্যান্ড্রয়েড এক্স (মেটেরিয়াল ডিজাইনিং) এ কাজ করে
ব্ল্যাকব্লাইন্ড

43

গ্রহণযোগ্য উত্তর যুক্ত করতে, যদি আপনি কোটলিন ব্যবহার করেন।

@ColorInt
fun Context.getColorFromAttr(
    @AttrRes attrColor: Int,
    typedValue: TypedValue = TypedValue(),
    resolveRefs: Boolean = true
): Int {
    theme.resolveAttribute(attrColor, typedValue, resolveRefs)
    return typedValue.data
}

এবং তারপরে আপনার ক্রিয়াকলাপে আপনি এটি করতে পারেন

textView.setTextColor(getColorFromAttr(R.attr.color))


2
ওওোক, "সংহতকরণ" এর জন্য ধন্যবাদ। আমি কোটলিন ব্যবহার করছি না তবে এটি আকর্ষণীয়।
সেরফিমের

5
ভাল এটি টাইপডালিয়াকে বাইরের বিশ্বের কাছে দৃশ্যমান করে তোলে। এবং রঙগুলির জন্য আপনি সর্বদা রেফারেনশিয়াল ঘোষণাগুলি সমাধান করতে চান, তাই আমার কাছে এটি রয়েছে: @ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }(এখানে খারাপভাবে ফর্ম্যাট করা তবে এটি ঠিক আছে)
মিলোস্মেন্স

1
ব্যবহার এর মতো হবে:val errorColor = context.getThemeColor(R.attr.colorError)

আরও সর্বজনীন উপায়, যা এর জন্য ডিফল্ট মানটি পুনরুদ্ধার করে ColorStateList: @ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = obtainStyledAttributes(intArrayOf(attribute)).use { it.getColor(0, Color.MAGENTA) }( নিক কসাই থেকে )
gmk57

চূড়ান্ত উপায়, যা পুরোপুরি পুনরুদ্ধার করে ColorStateList, এমনকি যদি এটি অন্য থিমের বৈশিষ্ট্যগুলিকে উল্লেখ করে: fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }(একক রঙগুলি একটিতেও আবৃত হবে ColorStateList)।
gmk57

24

এটি আমার পক্ষে কাজ করেছে:

int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, android.R.color.black);
ta.recycle();

যদি আপনি এটি থেকে হেক্সস্ট্রিং পেতে চান:

Integer.toHexString(color)

এটি একটি কালারইন্ট নয়, রঙিন রিটার্ন করবে।
মিহা_এক্স 64

আমি এইটি ব্যবহারটি কলরার রিসোর্স (রঙ) দিয়ে এবং রিসাইকাকে কল না করে দিয়ে শেষ করেছি।
জেক আরান

2

আপনি যদি একাধিক রঙ পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

int[] attrs = {R.attr.customAttr, android.R.attr.textColorSecondary, 
        android.R.attr.textColorPrimaryInverse};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);

int[] colors = new int[attrs.length];
for (int i = 0; i < attrs.length; i++) {
    colors[i] = ta.getColor(i, 0);
}

ta.recycle();

2

এটি আপনার বিল্ড.gradle (অ্যাপ) এ যুক্ত করুন:

implementation 'androidx.core:core-ktx:1.1.0'

এবং এই কোডটি আপনার কোডের কোথাও যুক্ত করুন:

@ColorInt
@SuppressLint("Recycle")
fun Context.themeColor(
    @AttrRes themeAttrId: Int
): Int {
    return obtainStyledAttributes(
        intArrayOf(themeAttrId)
    ).use {
        it.getColor(0, Color.MAGENTA)
    }
}

0

এখানে একটি সংক্ষিপ্ত জাভা ইউটিলিটি পদ্ধতি যা একাধিক বৈশিষ্ট্য গ্রহণ করে এবং রঙ পূর্ণসংখ্যার অ্যারে প্রদান করে। :)

/**
 * @param context    Pass the activity context, not the application context
 * @param attrFields The attribute references to be resolved
 * @return int array of color values
 */
@ColorInt
static int[] getColorsFromAttrs(Context context, @AttrRes int... attrFields) {
    int length = attrFields.length;
    Resources.Theme theme = context.getTheme();
    TypedValue typedValue = new TypedValue();

    @ColorInt int[] colorValues = new int[length];

    for (int i = 0; i < length; ++i) {
        @AttrRes int attr = attrFields[i];
        theme.resolveAttribute(attr, typedValue, true);
        colorValues[i] = typedValue.data;
    }

    return colorValues;
}

এর জন্য জাভা কোটলিনের চেয়ে ভাল?
ইগোরগানাপলস্কি

@ ইগরগানাপলস্কি ওহ, আমি সত্যই জানি না। আমি আমার কোডটি ভাগ করে নিলাম যেহেতু আমি জানতাম যে এটি কারওর হাতে আসবে! আমি কোটলিনকে জানি না এবং আমি ধারণা করি যে কোটলিন এটিকে আরও ভাল কিছু সম্পাদন করবে না, সম্ভবত কোডের কম লাইন! : পি
বারুন

-1

এমন একজন অঙ্কনযোগ্য আপনি ব্যবহার করা উচিত রেফারেন্স খুঁজছেন তাদের জন্য falseresolveRefs

theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);


রেফারেন্সে ভেরিয়েবল টাইপড ভ্যালু কী?
বেন 1

পরিবর্তনশীল থিমটি কী? * রেফারেন্সে?
বেন 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.