web-dev-qa-db-de.com

Wie wird die Anzahl der ungelesenen Benachrichtigungen in NavigationView von DrawerLayout festgelegt?

Ich habe eine NavigationView innerhalb DrawerLayout mit Android Design Support Library erstellt

 <Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     xmlns:app="http://schemas.Android.com/apk/res-auto"
     Android:id="@+id/drawer_layout"
     Android:layout_width="match_parent"
     Android:layout_height="match_parent"
     Android:fitsSystemWindows="true">

     <!-- other views -->

     <Android.support.design.widget.NavigationView
         Android:id="@+id/navigation"
         Android:layout_width="wrap_content"
         Android:layout_height="match_parent"
         Android:layout_gravity="start"
         app:menu="@menu/my_navigation_items" />
 </Android.support.v4.widget.DrawerLayout>

my_navigation_items.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <group Android:checkableBehavior="single">
        <item
            Android:id="@+id/bookmarks_drawer"
            Android:icon="@drawable/ic_drawer_bookmarks"
            Android:title="@string/bookmarks" />
        <item
            Android:id="@+id/alerts_drawer"
            Android:icon="@drawable/ic_drawer_alerts"
            Android:title="@string/alerts" />
        <item
            Android:id="@+id/settings_drawer"
            Android:icon="@drawable/ic_drawer_settings"
            Android:title="@string/settings" />
    </group> 
</menu>

Jetzt möchte ich den Zähler für ungelesene Nachrichten für jedes Element von NavigationView wie im folgenden Bild festlegen:

unread notification counter

wie setze ich den Zähler für ungelesene Nachrichten auf den Eintrag von NavigationView?

26
Priyank Patel

Aktualisierte Antwort:

Die Verwendung von app:actionLayout Mit der Unterstützungsbibliothek 23.1.1 oder höher unterstützt das benutzerdefinierte Layout (siehe unten).

Erstellen Sie Ihr benutzerdefiniertes Zählerlayout wie unten.

menu_counter.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:gravity="center_vertical"
    Android:textAppearance="@style/TextAppearance.AppCompat.Body2" />

Verweisen Sie darauf in Ihrem Schubladenmenüelement in XML.

menu/drawer.xml:

<item
    Android:id="@+id/navigation_drawer_item_1"
    Android:icon="@drawable/ic_menu_1"
    Android:title="@string/navigation_drawer_item_1"
    app:actionLayout="@layout/menu_counter"
    />

Beachten Sie, dass Sie den Namensraum app verwenden sollten. Versuchen Sie nicht, Android zu verwenden.

Alternativ können Sie die Aktionsansicht manuell mit der Methode MenuItem.setActionView() festlegen.

Suchen Sie den Menüpunkt und stellen Sie den Zähler wie folgt ein:

private void setMenuCounter(@IdRes int itemId, int count) {
    TextView view = (TextView) navigationView.getMenu().findItem(itemId).getActionView();
    view.setText(count > 0 ? String.valueOf(count) : null);
}

Beachten Sie, dass Sie MenuItemCompat verwenden müssen, wenn Sie Android 2.x - Versionen unterstützen müssen.

Vorherige Antwort (Für ältere Version):

Gelöst mit ListView innerhalb von NavigationView wie folgt Code ...

<Android.support.design.widget.NavigationView
    Android:id="@+id/my_courses_nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header" >

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_marginTop="150dp" > <!-- Give layout margin top according to "headerLayout" height -->

        <ListView
            Android:id="@+id/left_drawer"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@Android:color/white"
            Android:cacheColorHint="@Android:color/transparent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp" />

    </FrameLayout>
</Android.support.design.widget.NavigationView>

In Ihrer Aktivität legen Sie den Listeneintrag wie folgt fest ...

    private final String[] mMenuTitles = { getResources().getString(R.string.bookmarks), getResources().getString(R.string.alerts), getResources().getString(R.string.settings)  };
    private final int[] mMenuIconId = { R.drawable.ic_drawer_bookmarks, R.drawable.ic_drawer_alerts, R.drawable.ic_drawer_settings };


    ListView mDrawerList = (ListView) findViewById(R.id.left_drawer);
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    private ArrayList<SlideMenuItem> drawerItemList = new ArrayList<SlideMenuItem>();           
    for( int i = 0; i < mMenuTitles.length; i++ ) {
        SlideMenuItem item = new SlideMenuItem();
        item.setTitle(mMenuTitles[i]);
        item.setIconID(mMenuIconId[i]);
        // item..setUnread(5) //set or update unread count & notify dataset changed to adapter
        drawerItemList.add(item);
    }

    MenuAdapter mMenuAdapter = new MenuAdapter( MyCoursesActivity.this, R.layout.drawer_list_item, drawerItemList);
    mDrawerList.setAdapter(mMenuAdapter);

Der Klicklistener für ListView in der Navigationsleiste ...

private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        try {
            mDrawerLayout.closeDrawers();
            SlideMenuItem item =  (SlideMenuItem) parent.getItemAtPosition(position);
            switch (item.getIconId()) {

                case R.drawable.ic_drawer_bookmarks: {

                }
                break;
                case R.drawable.ic_drawer_alerts: {

                }
                break;
                case R.drawable.ic_drawer_settings: {

                }
                break;                  
                default: {
                }
                break;
            }
        } catch (Exception e) {             
        }

    }
}

MenuAdapter..Java

public class MenuAdapter extends ArrayAdapter<SlideMenuItem> {

private Activity activity;
private List<SlideMenuItem> itemList;
private SlideMenuItem item;
private int row;

public MenuAdapter(Activity act, int resource, List<SlideMenuItem> arrayList) {
    super(act, resource, arrayList);
    this.activity = act;
    this.row = resource;
    this.itemList = arrayList;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ViewHolder holder;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(row, null);

        holder = new ViewHolder();
        holder.tvTitle = (TextView) view.findViewById(R.id.menu_title);
        holder.imgView = (ImageView) view.findViewById(R.id.menu_icon);
        holder.tvUnread = (TextView) view.findViewById(R.id.unread_count);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    if ((itemList == null) || ((position + 1) > itemList.size()))
        return view;

    item = itemList.get(position);

    holder.tvTitle.setText(item.getTitle());
    holder.imgView.setImageResource(item.getIconId());
    if( item.getUnreadCount() > 0 ) {
        holder.tvUnread.setVisibility(View.VISIBLE);
        holder.tvUnread.setText(item.getUnread());
        if( MyCoursesActivity.DRAWER_MENU_ALERTS_POSITION == position ) {
            holder.tvUnread.setBackgroundResource(R.drawable.round_unread_count_bg_red);    
        }
        else {
            holder.tvUnread.setBackgroundResource(R.drawable.round_unread_count_bg_green);
        }
    }
    else {
        holder.tvUnread.setVisibility(View.GONE);
    }
    return view;
}

public class ViewHolder {

    public TextView tvTitle;
    public ImageView imgView;
    public TextView tvUnread;
}

}

drawer_list_item.xml

<LinearLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" 
Android:layout_height="match_parent" 
Android:orientation="vertical">

<RelativeLayout
Android:id="@+id/drawar_list_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >

<ImageView
    Android:id="@+id/menu_icon"
    Android:layout_width="20dp"
    Android:layout_height="20dp"
    Android:layout_alignParentLeft="true"
    Android:layout_centerVertical="true"
    Android:layout_marginLeft="16dp"
    Android:layout_marginRight="16dp"
    Android:gravity="center_vertical"
    Android:src="@drawable/ic_drawer" />

<TextView
    Android:id="@+id/menu_title"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:layout_toLeftOf="@+id/unread_count"
    Android:layout_toRightOf="@+id/menu_icon"
    Android:minHeight="?attr/listPreferredItemHeightSmall"
    Android:paddingLeft="16dp"
    Android:paddingRight="16dp"
    Android:text="About Us"
    Android:gravity="center_vertical"
    Android:textAppearance="?android:attr/textAppearanceSmall"
    Android:textColor="@Android:color/black" />

<TextView
    Android:id="@+id/unread_count"
    Android:layout_width="20dp"
    Android:layout_height="20dp"
    Android:layout_alignParentRight="true"
    Android:layout_centerHorizontal="true"
    Android:layout_centerVertical="true"
    Android:layout_marginLeft="16dp"
    Android:layout_marginRight="16dp"
    Android:gravity="center" 
    Android:text="99+"
    Android:textColor="@Android:color/white"
    Android:textSize="10sp"
    Android:visibility="gone" />

SlideMenuItem.Java

public class SlideMenuItem {

private Bitmap icon;
private String title;
private String unread;
private int iconID;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public Bitmap getIcon() {
    return icon;
}

public void setIcon(Bitmap icon) {
    this.icon = icon;
}

public int getIconId() {
    return iconID;
}

public void setIconID(int icon) {
    this.iconID = icon;
}

public String getUnread() {
    return unread;
}

public int getUnreadCount() {
    int count = Flinnt.INVALID;
    try {
        if( null != unread ) {
            count = Integer.parseInt(unread);
        }
    } catch (Exception e) {
    }
    return count;
}

public void setUnread(String unread) {
    this.unread = unread;
}

}
54
Priyank Patel

NavigationView wurde entwickelt, um auf einfache Weise eine grundlegende Navigationsleiste zu implementieren, die den Richtlinien für das Materialdesign entspricht.

Wenn Sie mehr als eine einfache Navigationsschublade (d. H. Eine mit Textnavigationselementen und einer optionalen Kopfzeile) wünschen, müssen Sie ein eigenes Layout für Ihre Navigationsschublade erstellen.

5
Tanis.7x

Ich fand diese einfach zu implementierende Lösung auf dieser Website https://Android.jlelse.eu/Android-adding-badge-or-count-to-the-navigation-drawer-84c93af1f4d9 Folgen Sie den Schritten unten

Schritt 1: Erstellen Sie ein Android Studio-Projekt, anstatt eine leere Aktivität auszuwählen, wählen Sie „Aktivität der Navigationsleiste“.

Schritt 2: Hinzufügen des Attributs "actionViewClass" zum Menü der Navigationsleiste (d. H. Menu/youractivityname_drawer.xml)

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">

<group Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_camera"
        Android:icon="@drawable/ic_menu_camera"
        Android:title="Import" />
    <item
        Android:id="@+id/nav_gallery"
        app:actionViewClass="Android.widget.TextView"
        Android:icon="@drawable/ic_menu_gallery"
        Android:title="Gallery" />
    <item
        Android:id="@+id/nav_slideshow"
        app:actionViewClass="Android.widget.TextView"
        Android:icon="@drawable/ic_menu_slideshow"
        Android:title="Slideshow" />
    <item
        Android:id="@+id/nav_manage"
        Android:icon="@drawable/ic_menu_manage"
        Android:title="Tools" />
</group>

Schritt 3: Deklarieren Sie den Menüeintrag Navigation Drawer und initialisieren Sie den Eintrag mit dem Ausweiswert. Deklarieren Sie in Ihrer Hauptaktivität den Menüpunkt der Navigationsleiste wie unten angegeben

//Create these objects above OnCreate()of your main activity
TextView slideshow,gallery;

//These lines should be added in the OnCreate() of your main activity
 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);

gallery=(TextView) MenuItemCompat.getActionView(navigationView.getMenu().
        findItem(R.id.nav_gallery));

slideshow=(TextView) MenuItemCompat.getActionView(navigationView.getMenu().
        findItem(R.id.nav_slideshow));

//This method will initialize the count value
initializeCountDrawer();

Schritt 5: Initialisieren Sie initializeCountDrawer (), wo immer dies erforderlich ist. Es kann auch verwendet werden, um die Anzahl oder den Ausweiswert im Menüelement der Navigationsschublade zu aktualisieren.

private void initializeCountDrawer(){

   //Gravity property aligns the text
   gallery.setGravity(Gravity.CENTER_VERTICAL);
   gallery.setTypeface(null, Typeface.BOLD);
   gallery.setTextColor(getResources().getColor(R.color.colorAccent));
   gallery.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");
}

Quelle: https://Android.jlelse.eu/Android-adding-badge-or-count-to-the-navigation-drawer-84c93af1f4d9

5
Seunope

Ich würde vorschlagen, dass Sie die Navigationsansicht entfernen und die Navigationsschubladenelemente als Fragment hinzufügen, d. H. In der DarawerLayout-Datei

<Android.support.v4.widget.DrawerLayout    xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
<fragment
    Android:id = "@+id/fragment_navigation_drawer"
    Android:layout_width="280dp"
    Android:layout_height="match_parent"
    Android:layout_gravity = "start"
    Android:layout= "@layout/fragment_navigation_drawer"
    Android:name="com.your_package.NavigationDrawerFragment"
    tools:layout="@layout/fragment_navigation_drawer" />

</Android.support.v4.widget.DrawerLayout>

Erstellen Sie dann eine Klasse für das Fragment und eine Ressourcendatei für die Klasse, die die Elemente für Ihre Schublade enthält, d. H.

public class NavigationDrawerFragment extends Fragment {
...

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
...

Sie können dieses Fragment dann zu Ihrer Hauptaktivität hinzufügen, d. H.

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    navigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
    navigationDrawerFragment.setUp(R.id.fragment_navigation_drawer,mDrawerLayout, toolbar);

die "Setup" -Methode befindet sich im Fragment, und dort initialisieren Sie sie, d. h.

public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) {

    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mActionBarDrawerToggle = new ActionBarDrawerToggle(
            getActivity(), mDrawerLayout, toolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close
    ) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);

            }
            getActivity().invalidateOptionsMenu();

        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);


        }

}

Fügen Sie in der Layoutdatei für die Schublade die Elemente hinzu, für die Sie die ungelesene Benachrichtigung festlegen möchten, und fügen Sie dann ein relatives Layout hinzu, dessen Ausrichtung Sie auf vertikal festlegen, d. H.

<RelativeLayout
    Android:layout_below="@+id/drawer_layout_unread_notif"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="fill_parent">

Fügen Sie in diesem vertikalen relativen Layout ein weiteres relatives Layout für die Elemente hinzu. Dies ist der Ort, an dem Sie den Abschnitt "Benachrichtigungen" wie in dem von Ihnen geposteten Bild hinzufügen möchten. Dieses relative Layout sollte horizontal sein, d.h.

<RelativeLayout
        Android:layout_below="@+id/drawer_items_1"
        Android:orientation="horizontal"
        Android:background="@drawable/drawer_selector"
        Android:clickable="true"
        Android:layout_width="match_parent"
        Android:id="@+id/drawer_items_2"
        Android:layout_height="48dp">

        <ImageView
            Android:src="@drawable/ic_notification"
            Android:padding="8dp"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginLeft="16dp"
            Android:layout_marginRight="16dp"
            Android:layout_centerVertical="true"
            Android:layout_gravity="center_vertical"/>

        <TextView
            Android:text="Notifications"
            Android:textColor="@color/primary_text"
            Android:layout_marginLeft="72dp"
            Android:layout_centerVertical="true"
            Android:layout_gravity="center_vertical"
            Android:padding="8dp"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />

        <TextView
            Android:background="@color/red"
            Android:layout_marginRight="10dp"
            Android:id="@+id/drawer_notifications"
            Android:layout_alignParentRight="true"
            Android:padding="8dp"
            Android:layout_centerVertical="true"
            Android:textColor="@color/white"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />


    </RelativeLayout>

Das letzte Textview-Element im Code direkt darüber enthält den Zähler, den Sie für ungelesene Benachrichtigungen hinzufügen möchten. In der XML ist seine Farbe auf rot gesetzt. Ab hier können Sie einen Verweis in der Fragmentklasse des Navigationsfachs mit seiner ID (in oncreateview) abrufen und mit Ihrem Leistungsindikator auffüllen.

Hoffe das hilft!

2
Gabriel Wamunyu

Unterstützung dafür wurde in 23 der Designbibliothek hinzugefügt, glaube ich.

Legen Sie in Ihrer Menü-XML-Datei ein actionLayout im XML-Präfix app fest:

<menu 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"
tools:context="com.example.user.myapplication.MainActivity" >
    <item Android:id="@+id/menu_one"
        Android:checkable="true"
        Android:title="Unread items"
        app:actionLayout="@layout/unread_items"
        />
</menu>

Lassen Sie dann das im Menü enthaltene Layout die ungelesenen Elemente berechnen, wahrscheinlich mithilfe einer benutzerdefinierten Ansicht oder eines Fragments, um die Daten abzurufen.

0
newfivefour