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

Я хочу установить цвет фона всех элементов заголовка в меню 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 - обновить контакт
  • java.lang.NullPointerException: попытка вызвать виртуальный метод для ссылки на нулевой объект
  • Как закрыть другое приложение в Android?
  • Проблема Java HttpClient для Java Java UTF-8
  • как разобрать JSONArray в android
  • Попытка вызвать виртуальный метод 'android.view.Window $ Callback android.view.Window.getCallback ()' для ссылки на нулевой объект
  • CollapsingToolbarLayout не распознает прокрутку
  • Расчет пересечений между сегментами линии
  • android.app.Application нельзя использовать для android.app.Activity
  • Разметка текста на Android
  • Interesting Posts

    Шаблон дизайна для Undo Engine

    Добавить путь maven-build-class к плагину реализации плагинов

    Firebase Storage и Access-Control-Allow-Origin

    Почему я получаю ошибку компиляции «org / codehaus / groovy / control / CompilationFailedException»?

    Рисование линейного графика в Excel с числовой осью x

    Каковы некоторые настройки аудио / звуковой карты / драйвера, которые все еще позволяют вам «записывать то, что вы слышите»?

    Предотвратить отправку спама с помощью учетной записи Yahoo?

    Как я могу отображать использование памяти для каждого процесса, если я делаю «ps -ef»?

    ASP.NET MVC Html.DropDownList, заполненный вызовом Ajax для controllerа?

    Объяснение оператора двоеточия в:: $ {foo = value}

    Predict () – Может быть, я не понимаю

    загружать и сохранять несколько файлов csv с использованием selenium и python из всплывающего windows

    Объем компьютера падает при подключении USB-устройства

    Может ли Selenium Webdriver открывать windows браузера в фоновом режиме?

    Играть в mp3 или wav-файл через командную строку Linux

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