আমি কি অ্যান্ড্রয়েডে মেনু আইটেমের পটভূমি রঙ পরিবর্তন করতে পারি?
কারও কাছে এর কোনও সমাধান আছে কিনা দয়া করে আমাকে জানান। শেষ বিকল্পটি অবশ্যই এটি কাস্টমাইজ করার জন্য হবে তবে পাঠ্য রঙটি কাস্টমাইজ না করে পরিবর্তন করার কোনও উপায় আছে।
আমি কি অ্যান্ড্রয়েডে মেনু আইটেমের পটভূমি রঙ পরিবর্তন করতে পারি?
কারও কাছে এর কোনও সমাধান আছে কিনা দয়া করে আমাকে জানান। শেষ বিকল্পটি অবশ্যই এটি কাস্টমাইজ করার জন্য হবে তবে পাঠ্য রঙটি কাস্টমাইজ না করে পরিবর্তন করার কোনও উপায় আছে।
উত্তর:
আপনার থিমের একটি সহজ লাইন :)
<item name="android:actionMenuTextColor">@color/your_color</item>
actionBarStyle
, উদাহরণের মধ্যে নয় । এটি actionBarStyle
যৌক্তিক বলে মনে হলেও এটি এর মধ্যে কাজ করবে না !
<item name="actionMenuTextColor">@color/your_color</item>
করতে অ্যান্ড্রয়েড নেমস্পেস ব্যবহার করবেন না
theme
নিজের সরঞ্জামদণ্ডে কোনও বৈশিষ্ট্য সেট করেন তবে এটি কাজ করে।
মনে হয় এটি একটি
<item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>
আমার থিম এবং
<style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@android:color/primary_text_dark</item>
</style>
শৈলীতে। এক্সএমএল তালিকা-আইটেমগুলির স্টাইল পরিবর্তন করে তবে মেনু আইটেমগুলি নয়।
android:itemTextAppearance
অ্যাট্রিবিউট একটি শৈলী যার পিতা বা মাতা হল মধ্যে স্থাপন করা যাবে না parent="@android:style/Widget.Holo.ListPopupWindow"
যেহেতু সঠিকভাবে রেন্ডার করা হবে না। এটি অবশ্যই তার পিতামাতার মতো একটি শীর্ষ স্তরের স্টাইলে থাকতে হবে android:Theme.Holo.Light.DarkActionBar
।
Theme.Holo
বা Theme.Holo.Light.DarkActionBar
বা অনুরূপ।
আপনি পরিবর্তে MenuItem
ব্যবহার করে সহজেই পাঠ্যের রঙ পরিবর্তন করতে পারেন ।SpannableString
String
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.your_menu, menu);
int positionOfMenuItem = 0; // or whatever...
MenuItem item = menu.getItem(positionOfMenuItem);
SpannableString s = new SpannableString("My red MenuItem");
s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
item.setTitle(s);
}
menu.findItem(R.id.menu_item_id);
menu.getItem()
আপনি যদি থিম সহ নতুন সরঞ্জামদণ্ডটি ব্যবহার করছেন তবে Theme.AppCompat.Light.NoActionBar
আপনি এটি নিম্নলিখিত পদ্ধতিতে স্টাইল করতে পারেন।
<style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:textColorPrimary">@color/my_color1</item>
<item name="android:textColorSecondary">@color/my_color2</item>
<item name="android:textColor">@color/my_color3</item>
</style>`
আমি যে ফলাফল পেয়েছি তা অনুসারে,
android:textColorPrimary
পাঠ্যের রঙটি কি আপনার ক্রিয়াকলাপের নাম প্রদর্শন করে যা সরঞ্জামদণ্ডের প্রাথমিক পাঠ্য।
android:textColorSecondary
সাবটাইটেল এবং আরও বিকল্পের (3 ডট) বোতামের পাঠ্য রঙ। (হ্যাঁ, এটি এই সম্পত্তি অনুযায়ী এটির রঙ পরিবর্তন করেছে!)
android:textColor
মেনু সহ অন্যান্য সমস্ত পাঠ্যের রঙ।
অবশেষে থিমটি সরঞ্জামদণ্ডে সেট করুন
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:theme="@style/ToolbarTheme"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"/>
android:actionMenuTextColor
( স্ট্যাকওভারফ্লো . com/a/5538709/423105 দেখুন )।
আপনি যদি মেনুটি ব্যবহার করেন <android.support.design.widget.NavigationView />
তবে কেবল নীচে লাইনটি যুক্ত করুন NavigationView
:
app:itemTextColor="your color"
আইকনের জন্য রঙিন টিন্ট উপলব্ধ, এটি আপনার আইকনের জন্য রঙকেও ওভাররাইড করবে। তার জন্য আপনাকে নীচে লাইন যুক্ত করতে হবে:
app:itemIconTint="your color"
উদাহরণ:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:itemTextColor="@color/color_white"
app:itemIconTint="@color/color_white"
android:background="@color/colorPrimary"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer"/>
আশা করি এটা তোমাকে সাহায্য করবে।
আমি প্রোগ্রামের মতো এটি সম্পর্কে গিয়েছিলাম:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.changeip_card_menu, menu);
for(int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, spanString.length(), 0); //fix the color to white
item.setTitle(spanString);
}
return true;
}
আপনি এই প্রশ্নে দেখতে পারেন আপনার উচিত:
<item name="android:textColorPrimary">yourColor</item>
উপরের কোডটি API> = v21 এর জন্য মেনু ক্রিয়া আইটেমগুলির পাঠ্যের রঙ পরিবর্তন করে color
<item name="actionMenuTextColor">@android:color/holo_green_light</item>
উপরে API <ভি 21 এর কোড রয়েছে
আমি মেনু আইটেম স্ফীত করা হয় যখন একটি একক আইটেমের পাঠ্য রঙ পরিবর্তন করতে এইচটিএমএল ট্যাগ ব্যবহার। আশা করি এটি সহায়ক হবে।
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.findItem(R.id.main_settings).setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
return true;
}
একক সরঞ্জামদণ্ডের জন্য কাস্টম মেনু রঙ তৈরি করার সহজ উপায়, অ্যাপপ্লেমের জন্য নয়
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay.MenuBlue">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"/>
</android.support.design.widget.AppBarLayout>
স্টাইল.এক্সএমএল এ সাধারণ সরঞ্জামদণ্ড
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
আমাদের কাস্টম সরঞ্জামদণ্ড শৈলী
<style name="AppTheme.AppBarOverlay.MenuBlue">
<item name="actionMenuTextColor">@color/blue</item>
</style>
কোটলিনে আমি এই এক্সটেনশনগুলি লিখেছিলাম:
fun MenuItem.setTitleColor(color: Int) {
val hexColor = Integer.toHexString(color).toUpperCase().substring(2)
val html = "<font color='#$hexColor'>$title</font>"
this.title = html.parseAsHtml()
}
@Suppress("DEPRECATION")
fun String.parseAsHtml(): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(this)
}
}
এবং এটির মতো ব্যবহৃত:
menu.findItem(R.id.main_settings).setTitleColor(Color.RED)
সংক্ষিপ্ত উত্তর হল হ্যাঁ. ভাগ্যবান তুমি!
এটি করতে, আপনাকে অ্যান্ড্রয়েড ডিফল্ট স্টাইলগুলির কয়েকটি স্টাইলকে ওভাররাইড করতে হবে:
প্রথমত, অ্যান্ড্রয়েডে থিমগুলির সংজ্ঞাটি দেখুন :
<style name="Theme.IconMenu">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">@android:drawable/menu_selector</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_bright</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_bright</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>
সুতরাং, মেনুতে পাঠ্যের উপস্থিতি শৈলীর@android:style/TextAppearance.Widget.IconMenu.Item
সংজ্ঞায় এখনই রয়েছে :
<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>
সিস্টেমের সংস্থানসমূহের রঙিন ফোল্ডারে যদি আপনি তাকান তবে এখন আমাদের কাছে প্রশ্নযুক্ত রঙের নাম রয়েছে:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/bright_foreground_light_disabled" />
<item android:state_window_focused="false" android:color="@android:color/bright_foreground_light" />
<item android:state_pressed="true" android:color="@android:color/bright_foreground_light" />
<item android:state_selected="true" android:color="@android:color/bright_foreground_light" />
<item android:color="@android:color/bright_foreground_light" />
<!-- not selected -->
</selector>
শেষ পর্যন্ত, আপনার যা করা দরকার তা এখানে:
"TextAppearance.Widget.IconMenu.Item" ওভাররাইড করুন এবং আপনার নিজস্ব স্টাইল তৈরি করুন। তারপরে এটি আপনার পছন্দসইভাবে লিঙ্ক করুন এটি আপনার পছন্দ মতো করুন। আশা করি এটি আপনাকে সহায়তা করবে। শুভকামনা!
অ্যান্ড্রয়েডের বিকল্প মেনুটিকে পটভূমি সেট করতে বা পাঠ্যের উপস্থিতি পরিবর্তন করতে কাস্টমাইজ করা যায়। মেনুতে পটভূমি এবং পাঠ্য রঙ থিম এবং শৈলী ব্যবহার করে পরিবর্তন করা যায় না। অ্যান্ড্রয়েড সোর্স কোড (ডেটা \ রেজিস \ লেআউট \ আইকন_মেনু_সাইটম_লেআউটআউট.এমএমএল) ক্লাসের একটি কাস্টম আইটেম ব্যবহার করে "com.android.intern.view.menu.IconMenuItem" মেনু বিন্যাসের জন্য দেখুন। মেনুটি কাস্টমাইজ করতে আমরা উপরের শ্রেণিতে পরিবর্তন করতে পারি। এটি অর্জন করতে, লেআউটআইনফ্লেটার কারখানা শ্রেণিটি ব্যবহার করুন এবং দৃশ্যের জন্য পটভূমি এবং পাঠ্য রঙ সেট করুন।
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
getLayoutInflater().setFactory(new Factory() {
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (name .equalsIgnoreCase(“com.android.internal.view.menu.IconMenuItemView”)) {
try{
LayoutInflater f = getLayoutInflater();
final View view = f.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
// set the background drawable
view .setBackgroundResource(R.drawable.my_ac_menu_background);
// set the text color
((TextView) view).setTextColor(Color.WHITE);
}
});
return view;
} catch (InflateException e) {
} catch (ClassNotFoundException e) {}
}
return null;
}
});
return super.onCreateOptionsMenu(menu);
}
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
কোড উদাহরণের জন্য ধন্যবাদ। একটি কনটেক্সট মেনুতে এটি কাজ করার জন্য আমাকে এটি পরিবর্তন করতে হয়েছিল। এটা আমার সমাধান।
static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};
class MenuColorFix implements LayoutInflater.Factory {
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
try {
Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});
new Handler().post(new Runnable() {
public void run() {
try {
view.setBackgroundColor(Color.BLACK);
List<View> children = getAllChildren(view);
for(int i = 0; i< children.size(); i++) {
View child = children.get(i);
if ( child instanceof TextView ) {
((TextView)child).setTextColor(Color.WHITE);
}
}
}
catch (Exception e) {
Log.i(TAG, "Caught Exception!",e);
}
}
});
return view;
}
catch (Exception e) {
Log.i(TAG, "Caught Exception!",e);
}
}
return null;
}
}
public List<View> getAllChildren(ViewGroup vg) {
ArrayList<View> result = new ArrayList<View>();
for ( int i = 0; i < vg.getChildCount(); i++ ) {
View child = vg.getChildAt(i);
if ( child instanceof ViewGroup) {
result.addAll(getAllChildren((ViewGroup)child));
}
else {
result.add(child);
}
}
return result;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
LayoutInflater lInflater = getLayoutInflater();
if ( lInflater.getFactory() == null ) {
lInflater.setFactory(new MenuColorFix());
}
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.myMenu, menu);
}
আমার জন্য এটি অ্যান্ড্রয়েড 1.6, 2.03 এবং 4.03 এর সাথে কাজ করে।
আমি এটি ইউরেকা পেয়েছি !!
আপনার অ্যাপ্লিকেশন থিমে:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBarTheme</item>
<!-- backward compatibility -->
<item name="actionBarStyle">@style/ActionBarTheme</item>
</style>
আপনার অ্যাকশন বার থিমটি এখানে:
<style name="ActionBarTheme" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="android:background">@color/actionbar_bg_color</item>
<item name="popupTheme">@style/ActionBarPopupTheme</item
<!-- backward compatibility -->
<item name="background">@color/actionbar_bg_color</item>
</style>
এবং এখানে আপনার পপআপ থিম:
<style name="ActionBarPopupTheme">
<item name="android:textColor">@color/menu_text_color</item>
<item name="android:background">@color/menu_bg_color</item>
</style>
চিয়ার্স;)
কোডের নীচে মেনু আইটেম পাঠ্যের রঙ ব্যবহার করতে
<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>
কোথায়
<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>
ম্যাক্স.মাস্টারম্যানকে ধন্যবাদ, এই সমাধানটি আমি 22 স্তরে কাজ করতে পেরেছি:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
setMenuTextColor(menu, R.id.displaySummary, R.string.show_summary);
setMenuTextColor(menu, R.id.about, R.string.text_about);
setMenuTextColor(menu, R.id.importExport, R.string.import_export);
setMenuTextColor(menu, R.id.preferences, R.string.settings);
return true;
}
private void setMenuTextColor(Menu menu, int menuResource, int menuTextResource) {
MenuItem item = menu.findItem(menuResource);
SpannableString s = new SpannableString(getString(menuTextResource));
s.setSpan(new ForegroundColorSpan(Color.BLACK), 0, s.length(), 0);
item.setTitle(s);
}
হার্ডকোড পদ্ধতিতে Color.BLACK
অতিরিক্ত প্যারামিটারে পরিণত হতে পারে setMenuTextColor
। এছাড়াও, আমি এটি কেবল মেনু আইটেমগুলির জন্য ব্যবহার করেছি android:showAsAction="never"
।
আপনি প্রোগ্রামগতভাবে রঙ সেট করতে পারেন।
private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) {
toolbar.post(new Runnable() {
@Override
public void run() {
View settingsMenuItem = toolbar.findViewById(menuResId);
if (settingsMenuItem instanceof TextView) {
if (DEBUG) {
Log.i(TAG, "setMenuTextColor textview");
}
TextView tv = (TextView) settingsMenuItem;
tv.setTextColor(ContextCompat.getColor(context, colorRes));
} else { // you can ignore this branch, because usually there is not the situation
Menu menu = toolbar.getMenu();
MenuItem item = menu.findItem(menuResId);
SpannableString s = new SpannableString(item.getTitle());
s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0);
item.setTitle(s);
}
}
});
}
এটি কেবল আপনার থিমে যুক্ত করুন
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/AppTheme.ItemTextStyle</item>
</style>
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@color/orange_500</item>
</style>
21 এআইপি-তে পরীক্ষা করা হয়েছে
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">
, অন্যথায় পাঠ্যটি ওভারফ্লো মেনুতে খুব ছোট দেখাচ্ছে। আরও মনে রাখবেন যে এই কৌশলটি কেবল অ্যান্ড্রয়েড 5 এবং তারপরের উপর কাজ করে।
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.search, menu);
MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
SearchView searchView = (SearchView) myActionMenuItem.getActionView();
EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(Color.WHITE); //You color here
আমার পরিস্থিতিটি বিকল্পগুলির মেনুতে পাঠ্যের রঙ সেটিংস ছিল (মেনু বোতাম টিপে প্রধান অ্যাপ্লিকেশন মেনু প্রদর্শিত হয়েছে)।
পরীক্ষিত এপিআই 16 সঙ্গে appcompat-v7-27.0.2 গ্রন্থাগার, AppCompatActivity
জন্য MainActivity
এবং AppCompat
এ অ্যাপ্লিকেশনের জন্য থিম Andro আইডি ।
শৈলী.এক্সএমএল :
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="actionBarPopupTheme">@style/PopupTheme</item>
</style>
<style name="PopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
<item name="android:textColorSecondary">#f00</item>
</style>
textColorSecondary
এটি অন্যান্য উপাদানগুলিকে প্রভাবিত করে কিনা জানি না তবে এটি মেনু পাঠ্যের রঙকে নিয়ন্ত্রণ করে।
আমি বিষয়টিতে কয়েকটি উদাহরণ অনুসন্ধান করেছি তবে ব্যবহারের জন্য প্রস্তুত সমস্ত স্নিপেট কাজ করে না।
সুতরাং আমি এটিকে অ্যাপকম্প্যাট-ভি 7 লাইব্রেরির উত্স কোড (বিশেষত .আর প্যাকেজের রেস ফোল্ডারের সাথে ) দিয়ে অনুসন্ধান করতে চেয়েছিলাম ।
যদিও আমার ক্ষেত্রে আমি বিস্ফোরিত .আর নির্ভরতার সাথে Eclipse ব্যবহার করেছি । সুতরাং আমি ডিফল্ট শৈলীগুলি পরিবর্তন করতে এবং ফলাফলগুলি পরীক্ষা করতে পারি। গ্রেডল বা অ্যান্ড্রয়েড স্টুডিওর সাহায্যে গ্রন্থাগারগুলিকে কীভাবে বিস্ফোরিত করবেন তা জানেন না সরাসরি । এটি তদন্তের আরও একটি সূত্রের দাবিদার।
সুতরাং আমার উদ্দেশ্যটি ছিল তাই মেনু পাঠ্যের জন্য res / মান / মান.xML ফাইলের কোন রঙটি ব্যবহার করা হবে তা খুঁজে পেয়েছি (আমি প্রায় নিশ্চিত ছিলাম যে রঙটি সেখানে ছিল)।
#f00
সকলকে মূল্য করেছি।secondary_text_default_material_light
রঙ আইটেম দিয়ে শেষ করেছি ।@color/abc_secondary_text_material_light
।Base.ThemeOverlay.AppCompat.Light
এবং Platform.AppCompat.Light
।android:textColorSecondary
এবং android:textColorTertiary
মধ্যে Base.ThemeOverlay.AppCompat.Light
।android:textColorSecondary
।Theme.AppCompat.Light
এবং না ThemeOverlay.AppCompat.Light
)।Base.ThemeOverlay.AppCompat.Light
। এটি একটি শিশু ছিল ThemeOverlay.AppCompat.Light
।ThemeOverlay.AppCompat.Light
আমি এটির বৈশিষ্ট্যটির মান Base.Theme.AppCompat.Light.DarkActionBar
হিসাবে থিমটিতে এর ব্যবহার পেয়েছি actionBarPopupTheme
।Theme.AppCompat.Light.DarkActionBar
একটি শিশু ছিল Base.Theme.AppCompat.Light.DarkActionBar
যাতে আমি সেই বৈশিষ্ট্যটি আমার স্টাইলস.এক্সএমএলে ব্যবহার করতে পারি ছাড়াই ।ThemeOverlay.AppCompat.Light
এবং android:textColorSecondary
বৈশিষ্ট্যটি পরিবর্তন করেছি ।সেফির সমাধানটি কাজ করে না। উপরে বর্ণিত পদ্ধতিটি ব্যবহার করে বিকল্পগুলির মেনু আইটেমের পাঠ্য উপস্থিতিকে ওভাররাইড করা সম্ভব তবে আইটেম বা মেনু নয়। এটি করার জন্য প্রয়োজনীয়ভাবে 3 টি উপায় রয়েছে:
4441 সংখ্যা দেখুন : আরও ক্লুসের জন্য কাস্টম বিকল্প মেনু থিম ।
এই কোডটি চেষ্টা করুন ....
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
getLayoutInflater().setFactory(new Factory() {
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs) {
if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
try {
LayoutInflater f = getLayoutInflater();
final View view = f.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
// set the background drawable
view.setBackgroundResource(R.drawable.my_ac_menu_background);
// set the text color
((TextView) view).setTextColor(Color.WHITE);
}
});
return view;
} catch (InflateException e) {
} catch (ClassNotFoundException e) {
}
}
return null;
}
});
return super.onCreateOptionsMenu(menu);
}
java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
আপনি যদি কোনও পৃথক মেনু আইটেমের জন্য রঙ সেট করতে চান তবে একটি সরঞ্জামদণ্ডের থিমটি অনুকূলিতকরণ করা সঠিক সমাধান নয়। এটি অর্জন করতে, আপনি অ্যান্ড্রয়েডের ব্যবহার করতে পারেন: মেনু আইটেমটির জন্য অ্যাকশন লেআউট এবং অ্যাকশন ভিউ।
অ্যাকশন দেখার জন্য প্রথমে একটি এক্সএমএল লেআউট ফাইল তৈরি করুন। এই উদাহরণে আমরা অ্যাকশন ভিউ হিসাবে একটি বোতাম ব্যবহার করি:
menu_button.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/menuButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Done"
android:textColor="?android:attr/colorAccent"
style="?android:attr/buttonBarButtonStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
উপরের কোড স্নিপেটে, আমরা android:textColor="?android:attr/colorAccent"
বোতামের পাঠ্যের রঙ কাস্টমাইজ করতে ব্যবহার করি ।
তারপরে মেনুটির জন্য আপনার এক্সএমএল লেআউট ফাইলটিতে, app:actionLayout="@layout/menu_button"
নীচের প্রদর্শিত হিসাবে অন্তর্ভুক্ত করুন :
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menuItem"
android:title=""
app:actionLayout="@layout/menu_button"
app:showAsAction="always"/>
</menu>
onCreateOptionsMenu()
আপনার ক্রিয়াকলাপে সর্বশেষ পদ্ধতিটি ওভাররাইড করুন :
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.menuItem);
Button saveButton = item.getActionView().findViewById(R.id.menuButton);
saveButton.setOnClickListener(view -> {
// Do something
});
return true;
}
... বা খণ্ড:
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater){
inflater.inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.menuItem);
Button saveButton = item.getActionView().findViewById(R.id.menuButton);
button.setOnClickListener(view -> {
// Do something
});
}
ক্রিয়া দর্শন সম্পর্কে আরও বিশদের জন্য অ্যান্ড্রয়েড বিকাশকারী গাইডটি দেখুন ।
আপনি রঙের সাথে কোনও নির্দিষ্ট মেনু আইটেমটি এভাবে রঙ করতে পারেন, সমস্ত এপিআই স্তরের জন্য কাজ করে:
public static void setToolbarMenuItemTextColor(final Toolbar toolbar,
final @ColorRes int color,
@IdRes final int resId) {
if (toolbar != null) {
for (int i = 0; i < toolbar.getChildCount(); i++) {
final View view = toolbar.getChildAt(i);
if (view instanceof ActionMenuView) {
final ActionMenuView actionMenuView = (ActionMenuView) view;
// view children are accessible only after layout-ing
actionMenuView.post(new Runnable() {
@Override
public void run() {
for (int j = 0; j < actionMenuView.getChildCount(); j++) {
final View innerView = actionMenuView.getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
if (resId == itemView.getId()) {
itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color));
}
}
}
}
});
}
}
}
}
এটি করে আপনি ব্যাকগ্রাউন্ড সিলেক্টর ইফেক্টটি শিথিল করেছেন, সুতরাং মেনু আইটেমের সমস্ত শিশুদের জন্য একটি কাস্টম ব্যাকগ্রাউন্ড নির্বাচনকারী প্রয়োগ করার কোড এখানে।
public static void setToolbarMenuItemsBackgroundSelector(final Context context,
final Toolbar toolbar) {
if (toolbar != null) {
for (int i = 0; i < toolbar.getChildCount(); i++) {
final View view = toolbar.getChildAt(i);
if (view instanceof ImageButton) {
// left toolbar icon (navigation, hamburger, ...)
UiHelper.setViewBackgroundSelector(context, view);
} else if (view instanceof ActionMenuView) {
final ActionMenuView actionMenuView = (ActionMenuView) view;
// view children are accessible only after layout-ing
actionMenuView.post(new Runnable() {
@Override
public void run() {
for (int j = 0; j < actionMenuView.getChildCount(); j++) {
final View innerView = actionMenuView.getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
// text item views
final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
UiHelper.setViewBackgroundSelector(context, itemView);
// icon item views
for (int k = 0; k < itemView.getCompoundDrawables().length; k++) {
if (itemView.getCompoundDrawables()[k] != null) {
UiHelper.setViewBackgroundSelector(context, itemView);
}
}
}
}
}
});
}
}
}
}
এখানে সহায়তা ফাংশনটিও রয়েছে:
public static void setViewBackgroundSelector(@NonNull Context context, @NonNull View itemView) {
int[] attrs = new int[]{R.attr.selectableItemBackgroundBorderless};
TypedArray ta = context.obtainStyledAttributes(attrs);
Drawable drawable = ta.getDrawable(0);
ta.recycle();
ViewCompat.setBackground(itemView, drawable);
}
পাঠ্যের রঙ পরিবর্তন করার জন্য, আপনি কেবল মেনু আইটেমের জন্য একটি কাস্টম ভিউ সেট করতে পারেন এবং তারপরে আপনি পাঠ্যের জন্য রঙটি নির্ধারণ করতে পারেন।
নমুনা কোড: মেনু আইটেম.সেটঅ্যাকশনভিউ ()