Изменение цвета фона отдельных элементов меню навигации
Я хочу установить цвет фона всех элементов заголовка в меню Android в ящике навигации. Мой макет выглядит так:
Результат должен выглядеть следующим образом:
- Могу ли я хранить файлы изображений в firebase с помощью Java API
- Модель памяти Dalvik такая же, как Java?
- В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?
- Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse?
- IDEA: javac: исходный релиз 1.7 требует целевого релиза 1.7
Я узнал, что могу установить цвет текста, используя что-то вроде:
MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_item); SpannableString s = new SpannableString(menuItem.getTitle()); s.setSpan(new TextAppearanceSpan(this, R.style.TextAppearance), 0, s.length(), 0); if (menuItem.getItemId()==R.id.nav_targets){ menuItem.setTitle(s); }
Но как я могу установить цвет фона заполнения?
- Как изменить JDK по умолчанию для IntelliJ IDEA?
- Быстрое размытие растровых изображений для Android SDK
- ksoap2 org.xmlpull.v1.xmlpullparserexception Ожидаемая ошибка start_tag
- Файл Android FileInputStream для чтения () в String
- Chrome 59 и базовая аутентификация с seleniumом / флуоценолом
- Можно ли объявить переменную в Gradle, используемой в Java?
- Получение NoClassDefFoundError при использовании common.lang.StringUtils в javas-коде android?
- Выполнение не выполнено для задачи ': app: dexDebug'. com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException
Изменение цвета фона отдельных элементов меню
AFAIK Используя меню, это невозможно, вам нужно создать собственную navigationView
Когда вы используете BackgroundColorSpan
для установки фона в свой пункт меню, он только устанавливает фон в заголовок элемента меню не весь вид
ВЫХОД ИСПОЛЬЗОВАНИЯ
BackgroundColorSpan
Попробуйте этот способ, используя
RecyclerView
activity_main.xml
Основная деятельность
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { RecyclerView navRecyclerView; LinearLayoutManager layoutManager; ArrayList arrayList = new ArrayList<>(); NavigationAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); navRecyclerView = findViewById(R.id.navRecyclerView); navRecyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); navRecyclerView.setLayoutManager(layoutManager); initArray(); adapter = new NavigationAdapter(this, arrayList); navRecyclerView.setAdapter(adapter); } private void initArray() { NavigationDataModel model = new NavigationDataModel(); model.setColor(ContextCompat.getColor(this, R.color.colorPrimary)); model.setIcon(R.drawable.ic_menu_gallery); model.setTitle("Item 1"); arrayList.add(model); NavigationDataModel model2 = new NavigationDataModel(); model2.setColor(ContextCompat.getColor(this, R.color.colorRed)); model2.setIcon(R.drawable.ic_menu_camera); model2.setTitle("Item 2"); arrayList.add(model2); NavigationDataModel model3 = new NavigationDataModel(); model3.setColor(ContextCompat.getColor(this, R.color.colorGreen)); model3.setIcon(R.drawable.ic_menu_send); model3.setTitle("Item 3"); arrayList.add(model3); NavigationDataModel model4 = new NavigationDataModel(); model4.setColor(ContextCompat.getColor(this, R.color.colorPink)); model4.setIcon(R.drawable.ic_menu_share); model4.setTitle("Item 4"); arrayList.add(model4); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } }
NavigationAdapter
public class NavigationAdapter extends RecyclerView.Adapter { Context context; ArrayList arrayList = new ArrayList<>(); public NavigationAdapter(Context context, ArrayList arrayList) { this.context = context; this.arrayList = arrayList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.custom_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.navIcon.setImageResource(arrayList.get(position).getIcon()); holder.rootView.setBackgroundColor(arrayList.get(position).getColor()); holder.navTitle.setText(arrayList.get(position).getTitle()); } @Override public int getItemCount() { return arrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { ImageView navIcon; TextView navTitle; LinearLayout rootView; public ViewHolder(View itemView) { super(itemView); rootView = itemView.findViewById(R.id.rootView); navIcon = itemView.findViewById(R.id.navIcon); navTitle = itemView.findViewById(R.id.navTitle); } } }
NavigationDataModel
public class NavigationDataModel { private int icon, color; private String title; public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
ВЫВОД
Фоновый цвет текста можно изменить с помощью BackgroundColorScan
.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); MenuItem menuItem = navigationView.getMenu().findItem(R.id.your_menu_item_id); Spannable spannable = new SpannableString(menuItem.getTitle()); spannable.setSpan(new BackgroundColorSpan(0xFF00CCCC), 0, menuItem.getTitle().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); menuItem.setTitle(spannable);
Просто используйте RecyclerView
внутри DrawerLayout
вместо NavigationView
.
navigationView.ItemBackground = new ColorDrawable(Android.Graphics.Color.Green);
Это может помочь.