java android android-layout navigation navigation-drawer

java - Cambiar el color de fondo de los elementos de menú específicos individuales de navigationView



android android-layout (4)

Cambiar el color de fondo de elementos de menú específicos individuales

AFAIK Usando el menú, esto no es posible, necesita crear una navigationView personalizada.

Cuando utiliza BackgroundColorSpan para establecer el fondo en su elemento del menú, solo establece el fondo en el título del elemento del menú no en la vista completa

SALIDA USANDO BackgroundColorSpan

Prueba de esta manera usando RecyclerView

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/nav_header_main" /> <android.support.v7.widget.RecyclerView android:id="@+id/navRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>

Actividad principal

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { RecyclerView navRecyclerView; LinearLayoutManager layoutManager; ArrayList<NavigationDataModel> 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; } }

NavegaciónAdaptador

public class NavigationAdapter extends RecyclerView.Adapter<NavigationAdapter.ViewHolder> { Context context; ArrayList<NavigationDataModel> arrayList = new ArrayList<>(); public NavigationAdapter(Context context, ArrayList<NavigationDataModel> 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); } } }

NavegaciónDatosModelo

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

SALIDA

Quiero establecer el color de fondo de todos los elementos del encabezado en un menú de Android dentro de un cajón de navegación. Mi diseño se ve como:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="TopItem" android:id="@+id/top_item1"> // Here i want to set the background <menu> <group> <item android:id="@+id/sub_item1" android:title="SubItem" /> // Here no background </group> </menu> </item> <item android:title="TopItem" android:id="@+id/top_item2"> <menu> <group> <item android:id="@+id/sub_item2" android:title="SubItem" /> <item android:id="@+id/sub_item3" android:title="SubItem" /> <item android:id="@+id/sub_item4" android:title="SubItem" /> </group> </menu> </menu>

El resultado debería verse como:

Descubrí que puedo establecer el color del texto usando algo como:

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

Pero, ¿cómo puedo configurar el color de fondo de relleno?


Puede cambiar el color de fondo del texto con 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);


Simplemente use un RecyclerView dentro de DrawerLayout lugar de NavigationView .


navigationView.ItemBackground = new ColorDrawable(Android.Graphics.Color.Green);

Esto podría ayudar.