আমি কীভাবে প্রোগ্রামারেটিকভাবে কালারস্টেটলিস্ট তৈরি করব?


158

আমি এটি ColorStateListব্যবহার করে একটি প্রোগ্রামক্রমে তৈরির চেষ্টা করছি :

ColorStateList stateList = new ColorStateList(states, colors); 

তবে আমি নিশ্চিত নই যে দুটি পরামিতি কী।

ডকুমেন্টেশন অনুযায়ী:

public ColorStateList (int[][] states, int[] colors) 

এপিআই স্তর 1 এ যুক্ত হয়েছে

একটি কালারস্টেটলিস্ট তৈরি করে যা রাজ্য থেকে বর্ণগুলিতে নির্দিষ্ট ম্যাপিং দেয়।

কেউ দয়া করে আমাকে এটি কীভাবে তৈরি করবেন তা ব্যাখ্যা করতে পারেন?

রাজ্যগুলির জন্য দ্বি-মাত্রিক অ্যারের অর্থ কী?

উত্তর:


343

উপলব্ধ রাজ্যের তালিকার জন্য http://developer.android.com/references/android/R.attr.html#state_above_anchor দেখুন ।

আপনি যদি অক্ষম, ফোকাসহীন, চেক না করা রাজ্য ইত্যাদির জন্য রঙ সেট করতে চান তবে কেবল রাজ্যকে অস্বীকার করুন:

int[][] states = new int[][] {
    new int[] { android.R.attr.state_enabled}, // enabled
    new int[] {-android.R.attr.state_enabled}, // disabled
    new int[] {-android.R.attr.state_checked}, // unchecked
    new int[] { android.R.attr.state_pressed}  // pressed
};

int[] colors = new int[] {
    Color.BLACK,
    Color.RED,
    Color.GREEN,
    Color.BLUE
};

ColorStateList myList = new ColorStateList(states, colors);

45
"বিপরীত" রাজ্য সম্পর্কিত তথ্যের জন্য ধন্যবাদ!
বিভিবি

এটি ডিজাইনের লাইব্রেরি থেকে একটি কল্পের রঙ পরিবর্তন করতে ব্যবহৃত হতে পারে।
টপিরবয়

5
সতর্কতা: রজার এলিয়েনের উত্তর (এবং এটির প্রথম মন্তব্য) দেখুন এখানে বুঝতে হবে যে এখানে রাজ্যগুলির ক্রমটি নিম্নমানের: কারণ "সক্ষম" প্রথমে, এটি অন্যান্য অবস্থাগুলিকে ওভাররাইড করবে যা সাধারণত একটি বোতাম সক্ষম করার সময় ঘটে occur শেষ "সক্ষম" করা আরও ভাল। (অথবা "সক্ষম" এর পরিবর্তে, একটি খালি / ডিফল্ট আইটেম শেষ))
টুলমেকারস্টেভ

2
একটি বাটন যে রাষ্ট্র বজায় রাখা না (কোন টগল / চেকবক্সটি) হতে পারে জন্য রাজ্যের একটি মৌলিক তালিকা {pressed}, {focused}, {-enabled}, {}। এটা টগল একটি হতে পারে জন্য {checked, pressed}, {pressed}, {checked, focused}, {focused}, {checked}, {-enabled}, {}। অথবা একটি টগল যে উপেক্ষা ফোকাস: {checked, pressed}, {pressed}, {checked}, {-enabled}, {}
টুলমেকারস্টেভ

যদি কেউ এই সমাধানগুলির মধ্যে যে কোনও একটি চেষ্টা করে দেখেন, রাষ্ট্রগুলি সিলেক্টর.এক্সএমএল এর মতো ক্রমকে মনোযোগ দিন!
আন্তন মাকভ

75

প্রথম মাত্রাটি রাষ্ট্র সেটগুলির একটি অ্যারে, দ্বিতীয় রাজ্য নিজেই সেট করে। রঙের অ্যারে প্রতিটি মিলমান স্থিতিস্থলের জন্য বর্ণগুলি তালিকাভুক্ত করে, সুতরাং রঙের অ্যারের দৈর্ঘ্য রাজ্য অ্যারের প্রথম মাত্রার সাথে মেলে (বা যখন রাজ্যটি "ব্যবহৃত হয়" তখন এটি ক্র্যাশ হবে)। এখানে এবং উদাহরণ:

ColorStateList myColorStateList = new ColorStateList(
                        new int[][]{
                                new int[]{android.R.attr.state_pressed}, //1
                                new int[]{android.R.attr.state_focused}, //2
                                new int[]{android.R.attr.state_focused, android.R.attr.state_pressed} //3
                        },
                        new int[] {
                            Color.RED, //1
                            Color.GREEN, //2
                            Color.BLUE //3
                        }
                    );

আশাকরি এটা সাহায্য করবে.

সম্পাদনা উদাহরণ: একটি এক্সএমএল রঙের রাষ্ট্রের তালিকা:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/white"/>
    <item android:color="@color/black"/>
</selector>

এই মত দেখতে হবে

ColorStateList myColorStateList = new ColorStateList(
        new int[][]{
                new int[]{android.R.attr.state_pressed},
                new int[]{}
        },
        new int[] {
                context.getResources().getColor(R.color.white),
                context.getResources().getColor(R.color.black)
        }
);

নীচের এক্সএমএল "<সিলেক্টর এক্সএমএনএলএস: অ্যান্ড্রয়েড =" স্কিমাস.অ্যান্ড্রয়েড. com/apk/res/android "> <আইটেম অ্যান্ড্রয়েড: রাষ্ট্র_প্রেসড =" সত্য "অ্যান্ড্রয়েড: রঙ =" @ রঙ / সাদা "/ > <আইটেম অ্যান্ড্রয়েড: রঙ = "@ রঙ / কালো" /> </ সিলেক্টর> "কলারস্টেলিস্ট ব্যবহার করে।
সতীশ

@ সতীশকুমার আমার সম্পাদনা পরীক্ষা করে দেখুন, যদিও আমি এটি পরীক্ষা করে দেখিনি।
সু-আউ হাওয়ং

3
মিথ্যা অবস্থা নির্দিষ্ট করার জন্য আপনি এর মানটিকে তুচ্ছ করতে পারেন, তাই যদি আপনি কোনও রঙ
চাপতে

1
@ তিনসুকই যা বলেছিল তাতে যুক্ত করার জন্য: তবে পরে তালিকায় দুর্ঘটনাক্রমে কোনও আইটেমটি দমন করা এড়াতে, বেশিরভাগ রাজ্যের ক্ষেত্রে এটি প্রত্যাখ্যান করা বুদ্ধিমান হবে না - পরিবর্তে সমস্ত "অন্যান্য" সম্ভাব্যতাকে একটি ডিফল্ট (খালি) আইটেম দিয়ে পরিচালনা করুন new int[]{}শেষ - হিসাবে এই উত্তরের চূড়ান্ত কোড ব্লক দেখানো হয়েছে। কেবলমাত্র অবহেলিত মান যা আমি সাধারণত ব্যবহার করি তা হ'ল "সক্ষম"। আরেকটি উদাহরণ, যদি আপনি তিনটি ভিন্ন রং চান: "দৃষ্টি নিবদ্ধ করা + + চাপা", "দৃষ্টি নিবদ্ধ করা + + চাপা না", "চাপা + + দৃষ্টি নিবদ্ধ করা না", আপনি কেবল লাগাতে পারেন {focused, pressed}, {focused}, {pressed}। প্রথম "সত্য" ব্যবহার করা হবে।
টুলমেকারস্টেভ

2
... ভুল আপনি করতে পারে মত একটি ধারাবাহিক থাকতে হয় {pressed}, {-pressed}, {focused}, {-focused}। সমস্যাটি হ'ল {pressed}এবং {-pressed}সমস্ত সম্ভাবনা coverেকে রাখুন (বোতামটি চাপছে বা চাপবে না), সুতরাং পরে তালিকাভুক্ত কোনও রঙ ব্যবহার করা হবে না!
টুলমেকারস্টেভ

64

কখনও কখনও এটি যথেষ্ট হবে:

int colorInt = getResources().getColor(R.color.ColorVerificaLunes);
ColorStateList csl = ColorStateList.valueOf(colorInt);

20

দুর্ভাগ্যক্রমে সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করে না।

  1. আপনি প্রথমে চাপা স্থিতি সেট না করলে এটি এটি সনাক্ত করতে পারে না।
  2. যদি আপনি এটি সেট করে থাকেন, তবে আপনাকে ডিফল্ট রঙ যুক্ত করতে খালি স্থিতির সংজ্ঞা দিতে হবে
ColorStateList themeColorStateList = new ColorStateList(
        new int[][]{
                new int[]{android.R.attr.state_pressed},
                new int[]{android.R.attr.state_enabled},
                new int[]{android.R.attr.state_focused, android.R.attr.state_pressed},
                new int[]{-android.R.attr.state_enabled},
                new int[]{} // this should be empty to make default color as we want
        },
        new int[]{
                pressedFontColor,
                defaultFontColor,
                pressedFontColor,
                disabledFontColor,
                defaultFontColor
        }
);

এটি উত্স কোড থেকে নির্মাতা:

/**
 * Creates a ColorStateList that returns the specified mapping from
 * states to colors.
 */
public ColorStateList(int[][] states, int[] colors) {
    mStateSpecs = states;
    mColors = colors;

    if (states.length > 0) {
        mDefaultColor = colors[0];

        for (int i = 0; i < states.length; i++) {
            if (states[i].length == 0) {
                mDefaultColor = colors[i];
            }
        }
    }
}

5
যেমন একটি সিডনোট: আপনি এটির মতো আচরণ করতে হবে যেমন আপনি যদি অন্য কোনওভাবে করেন। এটি প্রথম রাষ্ট্রটি নির্বাচন করে যা সত্য। সুতরাং, যদি আপনার প্রথম রাজ্য হিসাবে state_enable করা থাকে তবে এটিকে রাষ্ট্র_প্রেস করার আগে নির্বাচন করা হবে - যতক্ষণ না ভিউ অক্ষম থাকে।
LeoFarage

এফডাব্লুআইডাব্লু, যেহেতু আপনি সর্বশেষে একটি ডিফল্ট উপাদান পেয়েছেন তাই আমি মনে করি না যে প্রথম "সক্ষম" উপাদানটি আপনাকে কোনও উপকার করতে পারে। কেন এটি পুরোপুরি সরিয়ে নেই?
টুলমেকারস্টেভ

18

ColorListকোটলিনে প্রোগ্রামালিমে কীভাবে তৈরি করবেন তার উদাহরণ এখানে :

val colorList = ColorStateList(
        arrayOf(
                intArrayOf(-android.R.attr.state_enabled),  // Disabled
                intArrayOf(android.R.attr.state_enabled)    // Enabled
        ),
        intArrayOf(
                Color.BLACK,     // The color for the Disabled state
                Color.RED        // The color for the Enabled state
        )
)

এছাড়াও, কোনও কোটলিন সহায়ক ফাংশনের জন্য আমার উত্তর নীচে দেখুন ।
arekolek

7

কোটলিনে জোনাথন এলিসের উত্তর বন্ধ করে আপনি কোডটিকে কিছুটা মূর্তিমান এবং পড়া সহজ করে তুলতে একটি সহায়ক ফাংশনটি সংজ্ঞায়িত করতে পারেন, আপনি পরিবর্তে এটি লিখতে পারেন:

val colorList = colorStateListOf(
    intArrayOf(-android.R.attr.state_enabled) to Color.BLACK,
    intArrayOf(android.R.attr.state_enabled) to Color.RED
)

colorStateListOf এভাবে প্রয়োগ করা যেতে পারে:

fun colorStateListOf(vararg mapping: Pair<IntArray, Int>): ColorStateList {
    val (states, colors) = mapping.unzip()
    return ColorStateList(states.toTypedArray(), colors.toIntArray())
}

আমারও আছে:

fun colorStateListOf(@ColorInt color: Int): ColorStateList {
    return ColorStateList.valueOf(color)
}

যাতে আমি একই ফাংশনটির নাম বলতে পারি, এটি নির্বাচক বা একক বর্ণের বিষয় নয়।


3

তৈরির জন্য আমার নির্মাতা শ্রেণি ColorStateList

private class ColorStateListBuilder {
    List<Integer> colors = new ArrayList<>();
    List<int[]> states = new ArrayList<>();

    public ColorStateListBuilder addState(int[] state, int color) {
        states.add(state);
        colors.add(color);
        return this;
    }

    public ColorStateList build() {
        return new ColorStateList(convertToTwoDimensionalIntArray(states),
                convertToIntArray(colors));
    }

    private int[][] convertToTwoDimensionalIntArray(List<int[]> integers) {
        int[][] result = new int[integers.size()][1];
        Iterator<int[]> iterator = integers.iterator();
        for (int i = 0; iterator.hasNext(); i++) {
            result[i] = iterator.next();
        }
        return result;
    }

    private int[] convertToIntArray(List<Integer> integers) {
        int[] result = new int[integers.size()];
        Iterator<Integer> iterator = integers.iterator();
        for (int i = 0; iterator.hasNext(); i++) {
            result[i] = iterator.next();
        }
        return result;
    }
}

ব্যবহার উদাহরণ

ColorStateListBuilder builder = new ColorStateListBuilder();
builder.addState(new int[] { android.R.attr.state_pressed }, ContextCompat.getColor(this, colorRes))
       .addState(new int[] { android.R.attr.state_selected }, Color.GREEN)
       .addState(..., some color);

if(// some condition){
      builder.addState(..., some color);
}
builder.addState(new int[] {}, colorNormal); // must add default state at last of all state

ColorStateList stateList = builder.build(); // ColorStateList created here

// textView.setTextColor(stateList);

2

আপনি যদি রিসোর্সটি Colors.xml ব্যবহার করেন

int[] colors = new int[] {
                getResources().getColor(R.color.ColorVerificaLunes),
                getResources().getColor(R.color.ColorVerificaMartes),
                getResources().getColor(R.color.ColorVerificaMiercoles),
                getResources().getColor(R.color.ColorVerificaJueves),
                getResources().getColor(R.color.ColorVerificaViernes)

        };

ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{colors[0]}); 

    example.setBackgroundTintList(csl);

2
getResources()ContextCompat.getColor(this,R.color.colorname);ContextCompat.getColor(getActivity(),R.color.colorname);
অবজ্ঞাত

অন্যান্য পাঠকদের জন্য স্পষ্ট করার জন্য, new int[0](প্রথম প্যারামিটারের তালিকার একটি উপাদান হিসাবে) একটি শূন্য দৈর্ঘ্যের অ্যারে এবং এটি ডিফল্ট রঙ নির্ধারণের প্রতিনিধিত্ব করে। এখানে এটিই একমাত্র উপাদান, যার অর্থ হল বাছুর বোতামের সমস্ত রাজ্যে প্রয়োগ করা হয় । এটি new int[]{}রজার এলিয়ানের উত্তরে দেখার সমতুল্য ।
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.