NavigationView Menüpunkte mit Zähler auf der rechten Seite
Lesezeit: 6 Minuten
Chris online
Das neue Navigationsansicht im Neuen Design-Support-Bibliothek funktioniert wirklich super.
Sie benutzen “Menüpunkte“, um die Optionen anzuzeigen.
Aber wie kann ich eine anzeigen Zähler zum Rechts des Menüpunktes?
Wie auf diesem Bild:
Oder wie im Google Mail App.
Du könntest versuchen, es zu verwenden android:actionLayout in Ihrem Menüpunkt. Haben Sie ein benutzerdefiniertes Layout mit einem TextView-Rand, der auf rechts eingestellt ist. Habe es nicht probiert. Lass mich wissen ob es funktioniert.
– Siriscac
31. Mai ’15 um 18:41 Uhr
actionLayout wird ignoriert, wenn es gesetzt ist.
– ChrisOnline
31. Mai ’15 um 19:01 Uhr
was meinst du mit ignoriert werden?
– Ewoks
10. Februar 16 um 10:13 Uhr
@Ewoks, du kannst es einstellen, aber es passiert nichts.
– ChrisOnline
10. Februar 16 um 18:21 Uhr
@chrisonline was erwartest du und was passiert nicht? Überprüfen Sie die akzeptierte Antwort, es funktioniert wie erwartet ohne Probleme
– Ewoks
11. Februar 16 um 9:39 Uhr
Alex Wasilkow
Ab Version 23 von appcompat-v7 NavigationView unterstützt Aktionsansichten, daher ist es ganz einfach, Zähler selbst zu implementieren.
Beachten Sie, dass Sie verwenden müssen MenuItemCompat wenn Sie Android 2.x-Versionen unterstützen müssen.
Irgendwie wird der Badge-Inhalt (Zahl) trotz Schwerkraft immer nach oben ausgerichtet: “center_vertical”.. habe ich etwas übersehen?
– Ewoks
10. Februar 16 um 10:10 Uhr
@Ewoks, wahrscheinlich hast du es verpasst android:layout_height="match_parent"
– Alex Wassilkow
10. Februar 16 um 13:57 Uhr
Eigentlich ja. Ich habe erwartet, dass es funktioniert, wenn ich die Schwerkraft und layout_gravity auf center_vertical setze, aber dass TextView automatisch in einem FrameLayout platziert wird und wenn die Höhe nicht auf match_parent gesetzt ist, hat layout_gravity keine Auswirkung. Danke
– Ewoks
11. Februar 16 um 9:41 Uhr
ya es hat perfekt funktioniert. Aber der obige Befehl braucht so viel Zeit, um den Code zu erhalten. Fügen Sie die Methode hinzu [setMenuCounter(menuitem ,notification_count);] vor dem Navigationscode und übergibt den Parameter, der im Navigationsbildschirm generiert werden soll. jetzt funktioniert es Charme
Mein Workaround bestand darin, einen SpannableString mit einem anderen Hintergrund als neuen Titel des MenuItems zu übergeben.
Ich weiß, ist nicht die beste Lösung und es ist nicht rechtsbündig, aber es funktioniert ganz gut als Zähler. Etwas wie das:
NavigationView navigation = (NavigationView)findViewById(R.id.navigation);
Menu menuNav = navigation.getMenu();
MenuItem element = menuNav.findItem(R.id.item5);
String before = element.getTitle().toString();
String counter = Integer.toString(5);
String s = before + " "+counter+" ";
SpannableString sColored = new SpannableString( s );
sColored.setSpan(new BackgroundColorSpan( Color.GRAY ), s.length()-(counter.length()+2), s.length(), 0);
sColored.setSpan(new ForegroundColorSpan( Color.WHITE ), s.length()-(counter.length()+2), s.length(), 0);
element.setTitle(sColored);
Um den Zähler zu verbessern, finden Sie hier eine gute Antwort, um die Ecken abgerundet zu setzen
Beispiel:
Irgendein Screenshot wie es aussieht?
– ChrisOnline
12. August 15 um 15:24 Uhr
Betrachtet man die Quelle für NavigationView, sie unterstützen derzeit kein benutzerdefiniertes Rendering der Menüelemente (siehe NavigationMenuPresenter und NavigationMenuAdapter). Hoffentlich stellen sie bald mehr Funktionalitäten zur Verfügung, da ich eine benutzerdefinierte Schriftart für die Menüelemente festlegen möchte, dies jedoch ohne Reflexion nicht kann.
Zur Schriftsache habe ich eine Frage gestellt und eine funktionierende Antwort erhalten: stackoverflow.com/questions/30668346/…
– Julio Zynger
12. Juni 15 um 21:33 Uhr
Ich wollte auch ein Abzeichen-Symbol für die Zähler haben. Dieses Abzeichen wäre pillenförmig und hätte die Fähigkeit, verschiedene Farben zu haben, um zwischen wichtigen Abzeichen und unwichtigen Abzeichen zu unterscheiden.
Um dies zu erreichen, habe ich ein benutzerdefiniertes Ansichtsabzeichen erstellt
class Badge @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
defStyleRes: Int = 0
) : LinearLayout(context, attrs, defStyle, defStyleRes) {
private val badgeText: TextView
private var important: Boolean
init {
inflate(context, R.layout.badge, this)
badgeText = findViewById(R.id.badge)
important = false
isImportant(important)
adjustVisibility()
}
fun setText(text: String) {
badgeText.text = text
adjustVisibility()
}
fun isImportant(isImportant: Boolean) {
if (isImportant) {
badgeText.backgroundTintList = ColorStateList.valueOf(
ContextCompat.getColor(
context,
R.color.nav_badge_important
)
)
} else {
badgeText.backgroundTintList = ColorStateList.valueOf(
ContextCompat.getColor(
context,
R.color.nav_badge_unimportant
)
)
}
}
private fun adjustVisibility() {
if (badgeText.text.isNullOrBlank() && this.visibility == VISIBLE) {
this.visibility = INVISIBLE
} else {
this.visibility = VISIBLE
}
}
}
Für jeden Menüpunkt mit der Möglichkeit, ein Abzeichen anzuzeigen, müssen Sie hinzufügen app:actionViewClass="com.example.ui.Badge" zu Ihrem Navigationsmenü.
Die Badge-Klasse gibt Ihnen die Möglichkeit, den Text und die Wichtigkeit des Badges programmgesteuert festzulegen.
private fun setupBadges(navView: NavigationView) {
val badgesItemOne = navView.menu.findItem(R.id.nav_one).actionView as Badge
val badgesItemTwo = navView.menu.findItem(R.id.nav_two).actionView as Badge
val badgesItemThree = navView.menu.findItem(R.id.nav_three).actionView as Badge
badgesItemOne.setText("6+")
badgesItemOne.isImportant(true)
badgesItemTwo.setText("2")
badgesItemThree.setText("99+")
}
Dharma Sai Seerapu
Schritt 1 : Identifizieren Sie das Gruppenelement und fügen Sie „app:actionViewClass=android.widget.TextView“ wie unten angegeben hinzu:
Schritt 2: Deklarieren Sie das Menüelement „Navigation Drawer“ und initialisieren Sie das Element mit dem Badge-Wert
//Create these objects above OnCreate()of your main activity
TextView recorder,nightSection;
//These lines should be added in the OnCreate() of your main activity
recorder =(TextView) MenuItemCompat.getActionView(navigationView.getMenu().
findItem(R.id.nav_recorder));
recordSection=(TextView) MenuItemCompat.getActionView(navigationView.getMenu().
findItem(R.id.nav_night_section));
//This method will initialize the count value
initializeCountDrawer();
Schritt 3: initializeCountDrawer() kann aufgerufen werden, wo immer es erforderlich ist. Es kann auch verwendet werden, um die Anzahl oder den Badge-Wert im Menüelement der Navigationsleiste zu aktualisieren.
private void initializeCountDrawer(){
//Gravity property aligns the text
recorder.setGravity(Gravity.CENTER_VERTICAL);
recorder.setTypeface(null, Typeface.BOLD);
recorder.setTextColor(getResources().getColor(R.color.colorAccent));
recorder.setText("99+");
slideshow.setGravity(Gravity.CENTER_VERTICAL);
slideshow.setTypeface(null,Typeface.BOLD);
slideshow.setTextColor(getResources().getColor(R.color.colorAccent));
//count is added
slideshow.setText("7");
}
.
5952300cookie-checkNavigationView Menüpunkte mit Zähler auf der rechten Seiteyes
Du könntest versuchen, es zu verwenden
android:actionLayout
in Ihrem Menüpunkt. Haben Sie ein benutzerdefiniertes Layout mit einem TextView-Rand, der auf rechts eingestellt ist. Habe es nicht probiert. Lass mich wissen ob es funktioniert.– Siriscac
31. Mai ’15 um 18:41 Uhr
actionLayout wird ignoriert, wenn es gesetzt ist.
– ChrisOnline
31. Mai ’15 um 19:01 Uhr
was meinst du mit ignoriert werden?
– Ewoks
10. Februar 16 um 10:13 Uhr
@Ewoks, du kannst es einstellen, aber es passiert nichts.
– ChrisOnline
10. Februar 16 um 18:21 Uhr
@chrisonline was erwartest du und was passiert nicht? Überprüfen Sie die akzeptierte Antwort, es funktioniert wie erwartet ohne Probleme
– Ewoks
11. Februar 16 um 9:39 Uhr