বিকল্প মেনুর পটভূমির রঙ কীভাবে পরিবর্তন করবেন?


99

আমি সাদা অপশন মেনুর জন্য ডিফল্ট রঙ পরিবর্তন করার চেষ্টা করছি: আমি বিকল্প মেনুতে প্রতিটি আইটেমের জন্য একটি কালো পটভূমি চাই।

আমি অ্যান্ড্রয়েডের মতো কিছু অঙ্কুর চেষ্টা করেছি: আইটেমব্যাকগ্রাউন্ড = "# 000000" মেনু উপাদানটির মধ্যে আইটেম উপাদানটিতে কিন্তু এটি কার্যকর হয়নি।

আমি কীভাবে এটি সম্পাদন করতে পারি?



শ্রেষ্ঠ পথ এখানে stackoverflow.com/questions/3519277/...
user3156040

উত্তর:


66

সমস্ত বিকল্পের চেষ্টা করার জন্য যথেষ্ট পরিমাণ সময় ব্যয় করার পরে, ওভারফ্লো মেনু ব্যাকগ্রাউন্ডটি পরিবর্তন করতে আমি অ্যাপকম্প্যাট ভি 7 ব্যবহার করে অ্যাপটি পেতে সক্ষম হয়েছি কেবলমাত্র আইটেমব্যাকগ্রাউন্ড বৈশিষ্ট্যটি ব্যবহার করা হয়েছিল:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="android:itemBackground">@color/overflow_background</item>
    ...
</style>

এপিআই 4.2 থেকে 5.0 পর্যন্ত পরীক্ষিত।


4
এটি গ্রহণযোগ্য উত্তর, সহজ এবং সহজ হওয়া উচিত।
অ্যালেক্স আর্দাভিন

4
কিন্তু এটি রিপল প্রভাবটি সরিয়ে দেয়: / যাইহোক এটি পিছনে রাখা?
ডেভিড ভেলাস্কেজ 20

আমি পুরো উইন্ডো ব্যাকগ্রাউন্ডটি পরিবর্তন করতে চাই, পৃথক আইটেমের পটভূমি নয়, উদাহরণস্বরূপ, আপনি যদি এই জাতীয় পটভূমি (সীমান্ত সহ) সেট করেন তবে এটি প্রতিটি আইটেমের সীমানা যুক্ত করবে ...
ব্যবহারকার 25

4
মেনু টেক্সট রঙ সম্পর্কে কি?
ডক্ট্রামাম

51

এটি স্পষ্টতই একটি সমস্যা যা প্রচুর প্রোগ্রামারদের রয়েছে এবং যার কাছে গুগল এখনও একটি সন্তোষজনক, সমর্থিত সমাধান সরবরাহ করতে পারে নি।

এই বিষয়ে পোস্টগুলিতে প্রচুর ক্রস করা উদ্দেশ্য এবং ভুল বোঝাবুঝি রয়েছে, সুতরাং দয়া করে প্রতিক্রিয়া দেওয়ার আগে এই পুরো উত্তরটি পড়ুন।

নীচে আমি এই পৃষ্ঠার অন্যান্য উত্তরগুলি থেকে হ্যাকের আরও একটি "পরিশ্রুত" এবং ভালভাবে মন্তব্য করা সংস্করণ অন্তর্ভুক্ত করছি, এইগুলি খুব ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্নগুলি থেকে ধারণাগুলি একত্রিত করে:

অ্যান্ড্রয়েড মেনুটির পটভূমি রঙ পরিবর্তন করুন

বিকল্প মেনুর পটভূমির রঙ কীভাবে পরিবর্তন করবেন?

অ্যান্ড্রয়েড: অ্যাপ্লিকেশনটির মেনু কাস্টমাইজ করুন (উদাহরণস্বরূপ পটভূমির রঙ)

http://www.macadamian.com/blog/post/android_-_ থিমিং_এই_মুখে

অ্যান্ড্রয়েড মেনু আইটেম টগল বোতাম

অ্যান্ড্রয়েড বিকল্পগুলির মেনু ব্যাকগ্রাউন্ডটিকে অ-স্বচ্ছ হতে পারে?

http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx

মেনু ব্যাকগ্রাউন্ডটি অস্বচ্ছ হতে সেট করা

আমি এই হ্যাকটি 2.1 (সিমুলেটার), 2.2 (2 রিয়েল ডিভাইস) এবং 2.3 (2 রিয়েল ডিভাইস) এ পরীক্ষা করেছি। এখনও পরীক্ষা করার জন্য আমার কাছে কোনও 3. এক্স ট্যাবলেট নেই তবে আমি / যখন করি তা এখানে কোনও প্রয়োজনীয় পরিবর্তন পোস্ট করব। প্রদত্ত যে 3. এক্স ট্যাবলেটগুলি বিকল্প মেনুগুলির পরিবর্তে অ্যাকশন বারগুলি ব্যবহার করে, এখানে বর্ণিত:

http://developer.android.com/guide/topics/ui/menus.html#options-menu

এই হ্যাকটি অবশ্যই 3.X ট্যাবলেটগুলিতে কিছুই করবে না (কোনও ক্ষতি এবং কোনও ভাল হবে না)।

সমস্যার বিবৃতি (একটি নেতিবাচক মন্তব্য দিয়ে ট্রিগার-জবাব দেওয়ার আগে এটি পড়ুন):

বিকল্প মেনুতে বিভিন্ন ডিভাইসে বিস্তৃত স্টাইল রয়েছে। কারও গায়ে সাদা পাঠ্য সহ খাঁটি কালো, কারও গায়ে কালো লেখার সাথে খাঁটি সাদা। আমি এবং অন্যান্য অনেক বিকাশকারী বিকল্প মেনু কোষগুলির পটভূমি রঙের পাশাপাশি বিকল্পগুলি মেনু পাঠ্যের রঙও নিয়ন্ত্রণ করতে চান ।

নির্দিষ্ট অ্যাপ্লিকেশন বিকাশকারীদের কেবলমাত্র সেল ব্যাকগ্রাউন্ড কালার সেট করতে হবে (পাঠ্যের রঙ নয়) এবং এগুলি অ্যান্ড্রয়েড: প্যানেলফুলব্যাকগ্রাউন্ড শৈলীর অন্য উত্তরে বর্ণিত একটি ক্লিনার পদ্ধতিতে এটি করতে পারেন। তবে বর্তমানে শৈলীর সাহায্যে বিকল্প মেনু পাঠ্যের রঙ নিয়ন্ত্রণ করার কোনও উপায় নেই এবং তাই কেবল পটভূমিটিকে অন্য রঙে পরিবর্তনের জন্য এই পদ্ধতিটি ব্যবহার করতে পারেন যা পাঠ্যটি "অদৃশ্য হয়ে যাবে না"।

আমরা এটি একটি দস্তাবেজযুক্ত, ভবিষ্যত-প্রমাণ সমাধানের সাথে করতে চাই তবে অ্যান্ড্রয়েড <= 2.3 হিসাবে সহজভাবে পাওয়া যায় না। সুতরাং আমাদের এমন একটি সমাধান ব্যবহার করতে হবে যা বর্তমান সংস্করণগুলিতে কাজ করে এবং ভবিষ্যতের সংস্করণগুলিতে ক্রাশ / ব্রেক হওয়ার সম্ভাবনা হ্রাস করার জন্য ডিজাইন করা হয়েছে। আমরা এমন একটি সমাধান চাই যা ফলস্বরূপ ব্যর্থ হলে ডিফল্ট আচরণে ফিরে আসে।

বিকল্প মেনুগুলির চেহারা (সাধারণত অ্যাপ্লিকেশনের বাকী অংশের সাথে একটি ভিজ্যুয়াল শৈলীর সাথে মেলে এমন) করার প্রয়োজন হতে পারে এমন অনেকগুলি বৈধ কারণ রয়েছে যার ফলে আমি তাতে মনোনিবেশ করব না।

এটি সম্পর্কে একটি গুগল অ্যান্ড্রয়েড বাগ পোস্ট করা হয়েছে: দয়া করে এই বাগটি অভিনীত করে আপনার সমর্থন যুক্ত করুন (নোট গুগল "আমাকেও" মন্তব্যকে নিরুৎসাহিত করে: কেবল একটি তারা যথেষ্ট):

http://code.google.com/p/android/issues/detail?id=4441

সমাধানের সংক্ষিপ্ত বিবরণ

বেশ কয়েকটি পোস্টার লেআউটইনফ্লেটার.ফ্যাক্টরি জড়িত একটি হ্যাকের পরামর্শ দিয়েছে। প্রস্তাবিত হ্যাক অ্যান্ড্রয়েড <= 2.2 এর জন্য কাজ করেছে এবং অ্যান্ড্রয়েড ২.৩ এর জন্য ব্যর্থ হয়েছে কারণ হ্যাকটি একটি অনিবন্ধিত অনুমান করেছে: যে একই লেআউটইনফ্লেটার উদাহরণটিতে লেআউটইনফ্লেটার.ইনফ্লেটে () কল না করেই সরাসরি লেআউটইনফ্লেটার.জেটভিউ () কল করতে পারে। অ্যানড্রয়েড ২.৩ এ নতুন কোড এই ধারণাটি ভেঙে একটি নালপয়েন্টার এক্সসেপশনকে নিয়ে গেছে।

নীচে আমার সামান্য পরিশ্রুত হ্যাক এই অনুমানের উপর নির্ভর করে না।

তদুপরি, হ্যাকগুলি একটি অভ্যন্তরীণ, অপ্রকাশিত শ্রেণীর নাম "com.android.intern.view.menu.IconMenuItemView" স্ট্রিং হিসাবে (জাভা টাইপ হিসাবে নয়) ব্যবহার করে। আমি এড়াতে কোনও উপায় দেখতে পাচ্ছি না এবং এখনও নির্ধারিত লক্ষ্যটি অর্জন করি। তবে, "কম.অ্যান্ড্রয়েড.ইনটার্নাল.ভিউ.মেনু.আইকনমেনু আইটেমভিউ" বর্তমান সিস্টেমে প্রদর্শিত না হলে সতর্কতার সাথে হ্যাক করা সম্ভব।

আবার, বুঝুন যে এটি হ্যাক এবং কোনওভাবেই আমি দাবি করছি না এটি সমস্ত প্ল্যাটফর্মগুলিতে কাজ করবে। তবে আমরা বিকাশকারীরা একটি কল্পনাপ্রসূত একাডেমিক বিশ্বে বাস করছি না যেখানে সমস্ত কিছু বইয়ের দ্বারা হওয়া উচিত: আমাদের সমাধান করতে সমস্যা আছে এবং আমাদের এটি যথাসাধ্য সমাধান করতে হবে। উদাহরণস্বরূপ, এটি অসম্ভব বলে মনে হচ্ছে যে "com.android.internal.view.menu.IconMenuItemView" 3.X ট্যাবলেটে উপস্থিত থাকবে কারণ তারা বিকল্প মেনুগুলির পরিবর্তে অ্যাকশন বারগুলি ব্যবহার করে।

অবশেষে, কিছু বিকাশকারীরা Android অপশন মেনুটিকে পুরোপুরি দমন করে এবং তাদের নিজস্ব মেনু ক্লাস লিখে (উপরের লিঙ্কগুলির কয়েকটি দেখুন) এই সমস্যার সমাধান করেছেন। আমি এটি চেষ্টা করে দেখিনি, তবে আপনার নিজের ভিউ লিখতে এবং অ্যান্ড্রয়েডের ভিউটি কীভাবে প্রতিস্থাপন করতে হবে তা নির্ধারণ করার জন্য যদি সময় থাকে (আমি নিশ্চিত শয়তানের বিবরণ এখানে রয়েছে) তবে এটি একটি দুর্দান্ত সমাধান হতে পারে যার কোনও প্রয়োজন নেই doesn't অননুমোদিত হ্যাকস

টাট্টু:

কোডটি এখানে।

এই কোডটি ব্যবহার করতে, আপনার ক্রিয়াকলাপের ক্রিয়াকলাপ () বা ক্রিয়াকলাপগুলি মেনু () থেকে আপনার ক্রিয়াকলাপ থেকে addOptionsMenuHackerInflaterFactory () ওএনএসই কল করুন। এটি একটি ডিফল্ট কারখানা সেট করে যা পরবর্তী কোনও বিকল্প মেনু তৈরিতে প্রভাব ফেলবে। এটি ইতিমধ্যে তৈরি করা অপশন মেনুগুলিকে প্রভাবিত করে না (পূর্ববর্তী হ্যাকগুলি সেটমেনুব্যাকগ্রাউন্ডের ফাংশন নাম ব্যবহার করেছে), যা অত্যন্ত বিভ্রান্তিকর কারণ ফাংশনটি কোনও মেনু বৈশিষ্ট্যটি ফিরে আসার আগে সেট করে না)।

@SuppressWarnings("rawtypes")
static Class       IconMenuItemView_class = null;
@SuppressWarnings("rawtypes")
static Constructor IconMenuItemView_constructor = null;

// standard signature of constructor expected by inflater of all View classes
@SuppressWarnings("rawtypes")
private static final Class[] standard_inflater_constructor_signature = 
new Class[] { Context.class, AttributeSet.class };

protected void addOptionsMenuHackerInflaterFactory()
{
    final LayoutInflater infl = getLayoutInflater();

    infl.setFactory(new Factory()
    {
        public View onCreateView(final String name, 
                                 final Context context,
                                 final AttributeSet attrs)
        {
            if (!name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView"))
                return null; // use normal inflater

            View view = null;

            // "com.android.internal.view.menu.IconMenuItemView" 
            // - is the name of an internal Java class 
            //   - that exists in Android <= 3.2 and possibly beyond
            //   - that may or may not exist in other Android revs
            // - is the class whose instance we want to modify to set background etc.
            // - is the class we want to instantiate with the standard constructor:
            //     IconMenuItemView(context, attrs)
            // - this is what the LayoutInflater does if we return null
            // - unfortunately we cannot just call:
            //     infl.createView(name, null, attrs);
            //   here because on Android 3.2 (and possibly later):
            //   1. createView() can only be called inside inflate(),
            //      because inflate() sets the context parameter ultimately
            //      passed to the IconMenuItemView constructor's first arg,
            //      storing it in a LayoutInflater instance variable.
            //   2. we are inside inflate(),
            //   3. BUT from a different instance of LayoutInflater (not infl)
            //   4. there is no way to get access to the actual instance being used
            // - so we must do what createView() would have done for us
            //
            if (IconMenuItemView_class == null)
            {
                try
                {
                    IconMenuItemView_class = getClassLoader().loadClass(name);
                }
                catch (ClassNotFoundException e)
                {
                    // this OS does not have IconMenuItemView - fail gracefully
                    return null; // hack failed: use normal inflater
                }
            }
            if (IconMenuItemView_class == null)
                return null; // hack failed: use normal inflater

            if (IconMenuItemView_constructor == null)
            {
                try
                {
                    IconMenuItemView_constructor = 
                    IconMenuItemView_class.getConstructor(standard_inflater_constructor_signature);
                }
                catch (SecurityException e)
                {
                    return null; // hack failed: use normal inflater
                }
                catch (NoSuchMethodException e)
                {
                    return null; // hack failed: use normal inflater
                }
            }
            if (IconMenuItemView_constructor == null)
                return null; // hack failed: use normal inflater

            try
            {
                Object[] args = new Object[] { context, attrs };
                view = (View)(IconMenuItemView_constructor.newInstance(args));
            }
            catch (IllegalArgumentException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (InstantiationException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (IllegalAccessException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (InvocationTargetException e)
            {
                return null; // hack failed: use normal inflater
            }
            if (null == view) // in theory handled above, but be safe... 
                return null; // hack failed: use normal inflater


            // apply our own View settings after we get back to runloop
            // - android will overwrite almost any setting we make now
            final View v = view;
            new Handler().post(new Runnable()
            {
                public void run()
                {
                    v.setBackgroundColor(Color.BLACK);

                    try
                    {
                        // in Android <= 3.2, IconMenuItemView implemented with TextView
                        // guard against possible future change in implementation
                        TextView tv = (TextView)v;
                        tv.setTextColor(Color.WHITE);
                    }
                    catch (ClassCastException e)
                    {
                        // hack failed: do not set TextView attributes
                    }
                }
            });

            return view;
        }
    });
}

পড়া এবং উপভোগ করার জন্য ধন্যবাদ!


15
এটির (এবং অনুরূপ সমাধান) ব্যবহার করার চেষ্টা করার সময় আমি কেবল নির্ভরযোগ্যভাবে পাই `java.lang.IllegalStateException: এই
লেআউটইনফ্লেটারে

আমার জন্য কাজ কর! অবশেষে একটি সমাধান আছে তাই দুর্দান্ত! জিঞ্জারব্রেড, হানিকম্ব এবং আইসিএসে পরীক্ষিত
চাদ শুল্টজ

স্যামসুং গ্যালাক্সি নেক্সাসে পরীক্ষিত (4.1.1) এবং কাজ করছে! ভাল জিনিস, লুই!
ফিলিপ ক্যালডাস

4
গ্যালাক্সি নেক্সাস on (৪.১.১) এ কাজ করে তবে প্রথম বারের জন্য গোপন হওয়ার পরে মেনুতে পরবর্তী প্রতিটি কলের জন্য পাঠ্য রঙটি উল্টানো হয়।
ক্রু

4
আমি ইলিজেলস্টেট এক্সেপশনও পেয়েছি। দেখে মনে হচ্ছে হ্যাকটি অ্যাকশনবার শেরলকের সাথে বেমানান, যা আমি ব্যবহার করছি।
ট্র্যাভিস

20

মেনু পটভূমির জন্য শৈলীর বৈশিষ্ট্যটি হ'ল android:panelFullBackground

ডকুমেন্টেশন যা বলছে তা সত্ত্বেও, এটি একটি সংস্থান হতে হবে (যেমন @android:color/blackবা @drawable/my_drawable), আপনি যদি সরাসরি রঙের মান ব্যবহার করেন তবে এটি ক্রাশ হবে।

এটি প্রাইমলপপের সমাধান ব্যবহার করে যে আইটেমের সীমানা পরিবর্তন করতে বা সরাতে আমি অক্ষম ছিল তা থেকেও মুক্তি মিলবে।

পাঠ্য রঙের ক্ষেত্রে, আমি এটি ২.২-এ শৈলীর মাধ্যমে সেট করার কোনও উপায় খুঁজে পাইনি এবং আমি নিশ্চিত যে আমি সবকিছু চেষ্টা করেছি (যা আমি মেনু ব্যাকগ্রাউন্ডের বৈশিষ্ট্যটি আবিষ্কার করেছি)। এজন্য আপনাকে প্রাইমলপপের সমাধানটি ব্যবহার করতে হবে।


4
আমাকে এই মানটি কোথায় সেট করতে হবে? আমি এটি অ্যান্ড্রয়েড ২.২ এ কাজ করতে পারি না। বা 2.3
জানুশ

4
@ জানুস ইন স্টাইলস.এক্সএমএল। এটি সম্ভবত সহায়তা করবে: developer.android.com/guide/topics/resources/…
পাইলট_৫১

4
কাজ করে না, চমৎকার যদি আপনি বলতে চান যে যেখানে এটি যাওয়ার কথা ছিল, আমার মেনু আইটেমগুলিকে বৈশিষ্ট্যযুক্ত করার জন্য অন্য স্টাইল তৈরি করা বাদ দিয়ে সর্বত্র চেষ্টা করে
জন

14

অ্যান্ড্রয়েড ২.৩ এর জন্য এটি খুব ভারী হ্যাকিংয়ের সাহায্যে করা যেতে পারে:

অ্যান্ড্রয়েড ২.৩ নিয়ে সমস্যাগুলির মূল কারণ হ'ল লেআউটইনফ্লেটারে mConstructorArgs [0] = mContext কেবলমাত্র চলমান কল চলাকালীন সেট করা আছে

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352

protected void setMenuBackground(){

    getLayoutInflater().setFactory( new Factory() {

        @Override
        public View onCreateView (final String name, final Context context, final AttributeSet attrs ) {

            if ( name.equalsIgnoreCase( "com.android.internal.view.menu.IconMenuItemView" ) ) {

                try { // Ask our inflater to create the view
                    final LayoutInflater f = getLayoutInflater();
                    final View[] view = new View[1]:
                    try {
                        view[0] = f.createView( name, null, attrs );
                    } catch (InflateException e) {
                        hackAndroid23(name, attrs, f, view);
                    }
                    // Kind of apply our own background
                    new Handler().post( new Runnable() {
                        public void run () {
                            view.setBackgroundResource( R.drawable.gray_gradient_background);
                        }
                    } );
                    return view;
                }
                catch ( InflateException e ) {
                }
                catch ( ClassNotFoundException e ) {
                }
            }
            return null;
        }
    });
}

static void hackAndroid23(final String name,
    final android.util.AttributeSet attrs, final LayoutInflater f,
    final TextView[] view) {
    // mConstructorArgs[0] is only non-null during a running call to inflate()
    // so we make a call to inflate() and inside that call our dully XmlPullParser get's called
    // and inside that it will work to call "f.createView( name, null, attrs );"!
    try {
        f.inflate(new XmlPullParser() {
            @Override
            public int next() throws XmlPullParserException, IOException {
                try {
                    view[0] = (TextView) f.createView( name, null, attrs );
                } catch (InflateException e) {
                } catch (ClassNotFoundException e) {
                }
                throw new XmlPullParserException("exit");
            }   
        }, null, false);
    } catch (InflateException e1) {
        // "exit" ignored
    }
}

আমি এটিকে অ্যান্ড্রয়েড ২.৩ এ কাজ করতে এবং আগের সংস্করণগুলিতে এখনও কাজ করার জন্য পরীক্ষা করেছি। পরবর্তী অ্যান্ড্রয়েড সংস্করণগুলিতে যদি আবার কিছু না ভাঙে তবে আপনি কেবল পরিবর্তে ডিফল্ট মেনু-স্টাইল দেখতে পাবেন see


এই কোডটি কেবলমাত্র সংস্করণ ২.১ পর্যন্ত চলেছে
ফিলিপ

হাই, আমি আপনার ফাংশন ব্যবহার করেছি কিন্তু আমি এই নিম্নলিখিত ত্রুটির পেয়েছিলাম বৃদ্ধি বর্গ com.android.internal.view.menu.IconMenuItemView ত্রুটি এবং তারপর আরো একটি ব্যতিক্রম ত্রুটি বৃদ্ধি বর্গ <অজানা> ... এখন কি এখন আমি কি করা উচিত ... ? আমাকে সাহায্য করুন.
রুশভ প্যাটেল

13

জিঞ্জারব্রেডের সাথে সামঞ্জস্যপূর্ণ হওয়া এবং এখনও যতটা সম্ভব হোলো-সক্ষম সক্ষম ডিভাইসগুলি থেকে স্টাইলিং যতটা সম্ভব রক্ষা করা দরকার এমন একটি অ্যাপ্লিকেশনটিতে, কেবল এই ইস্যুটিতে ছড়িয়ে পড়ে।

আমি একটি তুলনামূলকভাবে পরিষ্কার সমাধান পেয়েছি, যা আমার জন্য ঠিক আছে।

থিমটিতে আমি একটি কাস্টম পটভূমির রঙ পেতে 9-প্যাচের অঙ্কনযোগ্য পটভূমি ব্যবহার করি:

<style name="Theme.Styled" parent="Theme.Sherlock">
   ...
   <item name="android:panelFullBackground">@drawable/menu_hardkey_panel</item>
</style>

আমি পাঠ্যের রঙের স্টাইল করার চেষ্টা ছেড়ে দিয়েছি এবং কোডটিতে আমার আইটেমের জন্য পাঠ্য রঙ সেট করতে সবেমাত্র একটি স্প্যানিয়েবল ব্যবহার করেছি:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
   MenuInflater inflater = getSupportMenuInflater();
   inflater.inflate(R.menu.actions_main, menu);

   if (android.os.Build.VERSION.SDK_INT < 
        android.os.Build.VERSION_CODES.HONEYCOMB) {

        SpannableStringBuilder text = new SpannableStringBuilder();
        text.append(getString(R.string.action_text));
        text.setSpan(new ForegroundColorSpan(Color.WHITE), 
                0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        MenuItem item1 = menu.findItem(R.id.action_item1);
        item1.setTitle(text);
   }

   return true;
}

একটি জিঞ্জারব্রেড ডিভাইসে অ্যাকশনবার শেরলক লাইট থিম ব্যবহার করে আমার ইস্যুটির জন্য দুর্দান্ত কাজ করে! এই সঙ্গে, আমি সহজে বিকল্প মেনু পটভূমি একটি হালকা ধূসর এবং পাঠ্য রঙ কালো করার জন্য (পরিবর্তন করতে পারেন আইকন ইতিমধ্যে ActionBar হিসেবে কালো বেশী আপনাকে ধন্যবাদ!!
florianbaethge

13

আমি এভাবেই সমাধান করেছি। আমি কেবল শৈলীতে পটভূমির রঙ এবং পাঠ্যের রঙ নির্দিষ্ট করেছি। যেমন res> মান> শৈলী.এক্সএমএল ফাইল।

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:itemBackground">#ffffff</item>
    <item name="android:textColor">#000000</item>
</style>

4
পাঠ্য রঙটি সর্বত্র পরিবর্তিত হবে
user3156040

এটি কেবল আইটেমের পটভূমির রঙ পরিবর্তন করে এবং মেনু বিকল্পের লেআউটে উপরে এবং নীচে প্যাডিং রয়েছে, এতে কোনও লাভ হয় না
FarshidABZ

10

একটি বিষয় লক্ষ্য করুন যে আপনি ছেলেরাও অন্যান্য পোস্টগুলির মতোই সমস্যাটিকে অতি-জটিল করে তুলছেন! আপনাকে যা করতে হবে তা হ'ল আপনার প্রয়োজনীয় ব্যাকগ্রাউন্ডের সাহায্যে অঙ্কনযোগ্য নির্বাচনকারী নির্বাচন করা এবং তাদেরকে আসল আইটেমগুলিতে সেট করা। আমি কেবল আপনার সমাধানগুলি চেষ্টা করার জন্য দুটি ঘন্টা ব্যয় করেছি (সমস্ত এই পৃষ্ঠায় প্রস্তাবিত) এবং তাদের কোনওটিই কাজ করেনি। উল্লেখ করার দরকার নেই যে প্রচুর ত্রুটি রয়েছে যা আপনার প্রয়োজনীয় চেষ্টাগুলি / ক্যাপ ব্লকগুলিতে আপনার কার্য সম্পাদনকে ধীরে ধীরে ধীরে ধীরে কমিয়ে দেয়।

যাইহোক এখানে একটি মেনু এক্সএমএল ফাইল:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/m1"
          android:icon="@drawable/item1_selector"
          />
    <item android:id="@+id/m2"
          android:icon="@drawable/item2_selector"
          />
</menu>

এখন আপনার আইটেম 1-সিলেক্টারে:

<?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/item_highlighted" />
    <item android:state_selected="true" android:drawable="@drawable/item_highlighted" />
    <item android:state_focused="true" android:drawable="@drawable/item_nonhighlighted" />
    <item android:drawable="@drawable/item_nonhighlighted" />
</selector>

পরের বার আপনি কানাডার মাধ্যমে সুপার মার্কেটে যাওয়ার সিদ্ধান্ত নেওয়ার জন্য গুগল ম্যাপ ব্যবহার করে দেখুন!


আমি সম্পূর্ণভাবে রাজী. অ্যান্ড্রয়েড যখন তিনি ইতিমধ্যে বিদ্যমান আছেন) ইতিমধ্যে উপস্থিত হন তবে কেন?
ফ্রেড্রিক

দুর্দান্ত কাজ করে। আপনার আইকন এবং পছন্দসই ব্যাকগ্রাউন্ডের সাহায্যে একটি স্তর তালিকা তৈরি করতে সক্ষম করুন। একমাত্র সমস্যা হ'ল আমি জানি না আমি পাঠ্যের রঙ পরিবর্তন করতে পারি কিনা। অতএব প্রতিটি পটভূমির রঙ কাজ করে না
জানুশ

53
সুন্দর, মার্জিত এবং পুরোপুরি সমস্যাটির সমাধান করে না।
এআই

4
যদি আমি ভুল না হয়ে থাকি তবে এটি কেবল আইকনের পটভূমি পরিবর্তন করে, মেনু আইটেমটি নিজেই নয়, যা সাদা থাকে।
Jrom

4
এটি প্রশ্নের উত্তরে নয়। এটি সম্পূর্ণ ভিন্ন চিন্তা।
Kostadin


3
    /* 
     *The Options Menu (the one that pops up on pressing the menu button on the emulator) 
     * can be customized to change the background of the menu 
     *@primalpop  
   */ 

    package com.pop.menu;

    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.InflateException;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.View;
    import android.view.LayoutInflater.Factory;

    public class Options_Menu extends Activity {

        private static final String TAG = "DEBUG";

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

        }

        /* Invoked when the menu button is pressed */

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            super.onCreateOptionsMenu(menu);
            MenuInflater inflater = new MenuInflater(getApplicationContext());
            inflater.inflate(R.menu.options_menu, menu);
            setMenuBackground();
            return true;
        }

        /*IconMenuItemView is the class that creates and controls the options menu 
         * which is derived from basic View class. So We can use a LayoutInflater 
         * object to create a view and apply the background.
         */
        protected void setMenuBackground(){

            Log.d(TAG, "Enterting setMenuBackGround");
            getLayoutInflater().setFactory( new Factory() {

                @Override
                public View onCreateView ( String name, Context context, AttributeSet attrs ) {

                    if ( name.equalsIgnoreCase( "com.android.internal.view.menu.IconMenuItemView" ) ) {

                        try { // Ask our inflater to create the view
                            LayoutInflater f = getLayoutInflater();
                            final View view = f.createView( name, null, attrs );
                            /* 
                             * The background gets refreshed each time a new item is added the options menu. 
                             * So each time Android applies the default background we need to set our own 
                             * background. This is done using a thread giving the background change as runnable
                             * object
                             */
                            new Handler().post( new Runnable() {
                                public void run () {
                                    view.setBackgroundResource( R.drawable.background);
                                }
                            } );
                            return view;
                        }
                        catch ( InflateException e ) {}
                        catch ( ClassNotFoundException e ) {}
                    }
                    return null;
                }
            });
        }
    }

4
দয়া করে এটি করবেন না: name.equalsIgnoreCase ("com.android.internal.view.menu.IconMenuItemView" নামটি পরিষ্কারভাবে ইঙ্গিত দেয় যে এটি ব্যক্তিগত প্রয়োগের বিশদ ব্যবহার করছে এবং এটি কোনও প্ল্যাটফর্ম আপডেট বা ডিভাইসকে ভেঙে ফেলতে পারে
হ্যাকবড

4
আইকনমেনুআইটেমভিউ হল এমন ক্লাস যা অপশন মেনু তৈরি করে এবং নিয়ন্ত্রণ করে যা বেসিক ভিউ ক্লাস থেকে প্রাপ্ত। এই শ্রেণিটি অ্যান্ড্রয়েড উত্স কোড থেকে এবং কমপক্ষে এপিআই সংস্করণ 5 থেকে উপস্থিত রয়েছে I আমি কোনও প্ল্যাটফর্ম আপডেট বা ডিভাইসে এটি ভাঙতে দেখতে পাচ্ছি না।
প্রাইমাল পপচাচান

4
আপনি এটি দেখতে পারবেন না কারণ আপনি ভবিষ্যত দেখতে পাচ্ছেন না। এমনকি যদি নিশ্চিত হওয়ার
কোনও উপায়ও ছিল তবে

ধন্যবাদ, এটি একটি চিমটি মধ্যে দরকারী। তবে, বিশেষ ক্ষেত্রে যেমন কাজ করে না যেমন অনক্রিটঅপশনস মেনুতে তৈরি আইটেম, তবে অনপ্রেপ্পিপশনমেনুতে অক্ষম থাকলেও পরে আবার সক্ষম হয়।
এইচআরজে

3

ধন্যবাদ মার্কাস! এটি কয়েকটি সিনট্যাক্স ত্রুটিগুলি ঠিক করে সহজেই 2.3 এ কাজ করে, এখানে স্থির কোড

    protected void setMenuBackground() {
    getLayoutInflater().setFactory(new Factory() {

        @Override
        public View onCreateView(final String name, final Context context,
                final AttributeSet attrs) {

            if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {

                try { // Ask our inflater to create the view
                    final LayoutInflater f = getLayoutInflater();
                    final View[] view = new View[1];
                    try {
                        view[0] = f.createView(name, null, attrs);
                    } catch (InflateException e) {
                        hackAndroid23(name, attrs, f, view);
                    }
                    // Kind of apply our own background
                    new Handler().post(new Runnable() {
                        public void run() {
                            view[0].setBackgroundColor(Color.WHITE);

                        }
                    });
                    return view[0];
                } catch (InflateException e) {
                } catch (ClassNotFoundException e) {

                }
            }
            return null;
        }
    });
}

static void hackAndroid23(final String name,
        final android.util.AttributeSet attrs, final LayoutInflater f,
        final View[] view) {
    // mConstructorArgs[0] is only non-null during a running call to
    // inflate()
    // so we make a call to inflate() and inside that call our dully
    // XmlPullParser get's called
    // and inside that it will work to call
    // "f.createView( name, null, attrs );"!
    try {
        f.inflate(new XmlPullParser() {
            @Override
            public int next() throws XmlPullParserException, IOException {
                try {
                    view[0] = (TextView) f.createView(name, null, attrs);
                } catch (InflateException e) {
                } catch (ClassNotFoundException e) {
                }
                throw new XmlPullParserException("exit");
            }
        }, null, false);
    } catch (InflateException e1) {
        // "exit" ignored
    }
}

4
আমি এর জন্য যা কিছু পাই তা: java.lang.IllegalStateException: ইতিমধ্যে এই
লেআউটইনফ্লেটারে

এটা ActionBarSherlock এবং সামঞ্জস্য ফ্রেমওয়ার্ক নিয়ে কাজ করতে এবং এড়াতে IllegalStateException এই কৌতুক দেখতে stackoverflow.com/questions/13415284/...
avianey

3
protected void setMenuBackground() {
    getLayoutInflater().setFactory(new Factory() {
        @Override
        public View onCreateView (String name, Context context, AttributeSet attrs) {
            if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
                try {
                    // Ask our inflater to create the view
                    LayoutInflater f = getLayoutInflater();
                    final View view = f.createView(name, null, attrs);
                    // Kind of apply our own background
                    new Handler().post( new Runnable() {
                        public void run () {
                            view.setBackgroundResource(R.drawable.gray_gradient_background);
                        }
                    });
                    return view;
                }
                catch (InflateException e) {
                }
                catch (ClassNotFoundException e) {
                }
            }
            return null;
        }
    });
}

এটি এক্সএমএল ফাইল

gradient 
    android:startColor="#AFAFAF" 
    android:endColor="#000000"
    android:angle="270"
shape

1

আপনি যদি একটি স্বেচ্ছাসেবী রঙ সেট করতে চান, এটি বরং এটি ভাল কাজ করবে বলে মনে হচ্ছে androidx। কিটক্যাট এবং পাইতে পরীক্ষা করা হয়েছে। এটি আপনার মধ্যে রাখুন AppCompatActivity:

@Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
    if (name.equals("androidx.appcompat.view.menu.ListMenuItemView") &&
            parent.getParent() instanceof FrameLayout) {
            ((View) parent.getParent()).setBackgroundColor(yourFancyColor);
    }
    return super.onCreateView(parent, name, context, attrs);
}

এটি এর রঙ নির্ধারণ করে android.widget.PopupWindow$PopupBackgroundView, যা আপনি অনুমান করেছিলেন, ব্যাকগ্রাউন্ডের রঙ আঁকবে। কোনও ওভারড্র নেই এবং আপনি আধা স্বচ্ছ রঙগুলিও ব্যবহার করতে পারেন।

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