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

Я хочу установить цвет фона всех элементов заголовка в меню 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); 

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

  • При создании службы нет пустого конструктора
  • Java: ошибка: переменная не была инициализирована
  • Приложение для Android в Eclipse: редактирование текста, не отображаемого на графическом макете
  • Как объект будет вызывать метод toString неявно?
  • Android: отправка данных> 20 байтов BLE
  • Сортировка с использованием Comparator-Descending order (Пользовательские classы)
  • Можем ли мы подключить удаленную базу данных MySQL на Android с помощью JDBC?
  • Предотвратить показ веб-страницы «веб-страница недоступна»
  • Как выполнить итерацию свойств id classа R.java?
  • AlertDialog изнутри BroadcastReceiver ?? Это можно сделать?
  • TimerTask vs Thread.sleep vs Handler postDelayed - наиболее точная функция вызова каждые N миллисекундов?
  • Interesting Posts

    Загрузить: показать сообщение об ошибке из HTTP-ответа

    Могу ли я получить список подключенных клиентов на openvpn (например, «список hamachi»?)

    Как разобрать текст справа налево в Блокноте?

    Использует ли атрибут Spring @Transactional собственный метод?

    Копирование файлов из одного каталога в другой в Java

    Как отключить автоматическое повторное добавление нежелательной раскладки клавиатуры в Windows 10?

    Когда я должен использовать @synthesize явно?

    Угловая: вызов функции controllerа внутри функции директивной ссылки с использованием &

    HTTPS не работает с Chrome

    Eclipse HotKey: как переключаться между вкладками?

    Можете ли вы создавать пользовательские операторы на C ++?

    Как мошенники получают ваши контакты, когда они отправляют письма, которые, как кажется, поступают от вас?

    В чем разница между свойством и переменной

    gcc не будет включать math.h

    как ссылаться на YAML «настройка» из другого места в том же файле YAML?

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