Me refiero a esta respuesta.

Funcionó, dándome cuenta frente al carrito en el menú del cajón de navegación, pero ¿cómo puedo hacer que el contador TextView esté dentro de un círculo?

Lo que quiero es:

enter image description here

Lo que obtengo del enlace anterior es que solo muestra el texto 2, no en un círculo.

Mi código:

Menú:--

      <item
        android:id="@+id/MyCart"
        android:icon="@drawable/ic_shopping_cart_black_24dp"
        android:title="My Cart"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:actionViewClass="android.widget.TextView"

        />

Actividad:--

 val  slideshow =
        MenuItemCompat.getActionView(navigationView!!.menu.findItem(R.id.MyCart)) as TextView
    //Gravity property aligns the text

    slideshow.setGravity(Gravity.CENTER_VERTICAL);
    slideshow.setTypeface(null,Typeface.BOLD);                                                                                                                    slideshow.setTextColor(getResources().getColor(R.color.colorAccent));
    //count is added


    RetrofitClient.instancecart.listcart(token).enqueue( object :
        Callback<CartResponse> {
        override fun onFailure(call: Call<CartResponse>, t: Throwable) {
            Toast.makeText(applicationContext,"falied", Toast.LENGTH_LONG).show()
        }

        override fun onResponse(
            call: Call<CartResponse>,
            response: Response<CartResponse>
        ) {

            val res=response
            if (response.isSuccessful) {

                val retro: String = response.body()!!.count.toString()

                slideshow.setText(retro) //retrofit api count

            }
        }

    })
}
3
IRON MAN 24 ago. 2020 a las 16:14

1 respuesta

La mejor respuesta

Parece que la respuesta que vinculó está desactualizada de alguna manera, pero también tiene opciones de estilo limitadas para TextView. Entonces puedes hacer esto en su lugar: configurando un actionLayout en lugar de actionViewClass.

screenshot of navigation drawer with circled counter

Primero, cree un recurso XML dibujable de círculo (llamémoslo res/drawable/navdrawer_counterbackground.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#ff0000"/>
</shape>

Luego crea un diseño para tu mostrador. Llamémoslo res/layout/nav_counter.xml. FrameLayout nos permite agregar gravedad alrededor de TextView, por lo que se puede centrar verticalmente en el elemento del menú. Tenga en cuenta que TextView tiene una identificación de counter. El ancho y alto del diseño de TextView controlan el tamaño del círculo.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/counter"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center"
        android:background="@drawable/nav_counterbackground"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textStyle="bold"
        tools:text="99+">
    </TextView>
</FrameLayout>

Asigne este diseño a su elemento de menú:

        <item
            android:id="@+id/nav_itemwithcounter"
            android:icon="@drawable/ic_whatever"
            android:title="@string/menu_whatever"
            app:actionLayout="@layout/nav_counter"/>

Luego, en su Actividad o Fragmento, cree una propiedad para TextView:

private lateinit var counterView: TextView

En onCreate() / onViewCreated() puede obtener la vista de navegación y usarla para obtener su referencia de TextView:

val navView: NavigationView = findViewById(R.id.nav_view)
counterView = navView.menu.findItem(R.id.nav_itemwithcounter).actionView.findViewById(R.id.counter)

Y puede actualizar la propiedad text y la visibilidad de este counterView siempre que lo necesite.

2
Tenfour04 25 ago. 2020 a las 13:51