এটি স্পষ্টতই একটি সমস্যা যা প্রচুর প্রোগ্রামারদের রয়েছে এবং যার কাছে গুগল এখনও একটি সন্তোষজনক, সমর্থিত সমাধান সরবরাহ করতে পারে নি।
এই বিষয়ে পোস্টগুলিতে প্রচুর ক্রস করা উদ্দেশ্য এবং ভুল বোঝাবুঝি রয়েছে, সুতরাং দয়া করে প্রতিক্রিয়া দেওয়ার আগে এই পুরো উত্তরটি পড়ুন।
নীচে আমি এই পৃষ্ঠার অন্যান্য উত্তরগুলি থেকে হ্যাকের আরও একটি "পরিশ্রুত" এবং ভালভাবে মন্তব্য করা সংস্করণ অন্তর্ভুক্ত করছি, এইগুলি খুব ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্নগুলি থেকে ধারণাগুলি একত্রিত করে:
অ্যান্ড্রয়েড মেনুটির পটভূমি রঙ পরিবর্তন করুন
বিকল্প মেনুর পটভূমির রঙ কীভাবে পরিবর্তন করবেন?
অ্যান্ড্রয়েড: অ্যাপ্লিকেশনটির মেনু কাস্টমাইজ করুন (উদাহরণস্বরূপ পটভূমির রঙ)
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;
@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;
View view = null;
if (IconMenuItemView_class == null)
{
try
{
IconMenuItemView_class = getClassLoader().loadClass(name);
}
catch (ClassNotFoundException e)
{
return null;
}
}
if (IconMenuItemView_class == null)
return null;
if (IconMenuItemView_constructor == null)
{
try
{
IconMenuItemView_constructor =
IconMenuItemView_class.getConstructor(standard_inflater_constructor_signature);
}
catch (SecurityException e)
{
return null;
}
catch (NoSuchMethodException e)
{
return null;
}
}
if (IconMenuItemView_constructor == null)
return null;
try
{
Object[] args = new Object[] { context, attrs };
view = (View)(IconMenuItemView_constructor.newInstance(args));
}
catch (IllegalArgumentException e)
{
return null;
}
catch (InstantiationException e)
{
return null;
}
catch (IllegalAccessException e)
{
return null;
}
catch (InvocationTargetException e)
{
return null;
}
if (null == view)
return null;
final View v = view;
new Handler().post(new Runnable()
{
public void run()
{
v.setBackgroundColor(Color.BLACK);
try
{
TextView tv = (TextView)v;
tv.setTextColor(Color.WHITE);
}
catch (ClassCastException e)
{
}
}
});
return view;
}
});
}
পড়া এবং উপভোগ করার জন্য ধন্যবাদ!