Изменение цвета фона отдельных элементов меню навигации

Я хочу установить цвет фона всех элементов заголовка в меню Android в ящике навигации. Мой макет выглядит так:

  // Here i want to set the background    // Here no background             

Результат должен выглядеть следующим образом:

введите описание изображения здесь

Я узнал, что могу установить цвет текста, используя что-то вроде:

 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); } 

Но как я могу установить цвет фона заполнения?

Изменение цвета фона отдельных элементов меню

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); 

Это может помочь.

  • Как запустить одновременно два метода
  • Заполните поля в веб-просмотре автоматически
  • ошибка идентификации устройства Android
  • Разметка текста на Android
  • onInterceptTouchEvent получает только ACTION_DOWN
  • HttpPost работает в Java-проекте, а не в Android
  • сортировка списка карт
  • Измерьте время выполнения для Java-метода
  • CollapsingToolbarLayout не распознает прокрутку
  • Как нарисовать представление поверх всего?
  • java.lang.ClassNotFoundException: org.postgresql.Driver, Android
  • Interesting Posts

    Linux: восстановление файлов

    C ++ Возвращаемый массив многомерности из функции

    XP CD не предлагает вариант ремонта

    Декартово произведение произвольных множеств в Java

    Может ли XP загружать драйверы предварительной установки из любого другого места, кроме дискеты?

    Как сохранить настройки шрифта в Notepad ++

    Передача сложных навигационных параметров с помощью MvvmCross ShowViewModel

    прокручивайте вверх и вниз по нажатию на кнопку выбора с помощью jquery

    Многострочная строка с дополнительным пространством (сохраненный отступ)

    Chrome – изменение навигационных клавиш на странице в программе просмотра PDF

    Сбой и ожидающие обновления: «перезагрузите компьютер для установки важных обновлений»?

    Java: как эффективно проверить нулевые указатели

    Как отделить список, разделенный запятой, на два столбца в Excel?

    Как перечислить зашифрованные файлы в Windows 7?

    Почему class String объявлен окончательным в Java?

    Давайте будем гением компьютера.