Tambahkan jumlah item baru ke ikon di tombol - Android

88

Saya pengembang. Saya perlu menerapkan desain yang ditunjukkan di bawah ini. Saya sudah memiliki aplikasi fungsional tetapi bertanya-tanya bagaimana cara mendekati ini? Khususnya, saya tertarik dengan cara menampilkan Jumlah item "Baru" di bawah tab. Apa yang saya TAHU bagaimana melakukannya - adalah membuat ikon baru dengan titik merah dan hanya menampilkannya ketika ada barang baru.

Tapi saya tidak tahu bagaimana membuat lingkaran bundar itu mengambang di atas judul DAN menunjukkan nomor di dalamnya. Apakah ada yang punya saran tentang apa yang terlalu dicari? Sampel? Petunjuk arah?

Pertanyaan kedua tentang memisahkan aktivitas. Haruskah saya membuat kontrol untuk menggabungkan tombol seperti ini dan hanya mengembangkannya pada aktivitas? Jika tidak, saya dapat membuat aktivitas tab tetapi saya tidak yakin apakah mungkin untuk menatanya agar terlihat seperti ini.

Porsi navigasi atas

katit
sumber

Jawaban:

165

Jadikan lencana Anda a TextView, sehingga Anda dapat menyetel nilai numerik ke apa pun yang Anda suka dengan menelepon setText(). Setel latar belakang TextViewsebagai XML <shape>drawable, yang dengannya Anda dapat membuat lingkaran padat atau gradien dengan batas. Drawable XML akan diskalakan agar sesuai dengan tampilan saat diubah ukurannya dengan lebih banyak atau lebih sedikit teks.

res / drawable / badge_circle.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval">
  <solid
    android:color="#F00" />
  <stroke
    android:width="2dip"
    android:color="#FFF" />
  <padding
    android:left="5dip"
    android:right="5dip"
    android:top="5dip"
    android:bottom="5dip" />
</shape>

Anda harus melihat bagaimana oval / lingkaran berskala dengan angka 3-4 digit yang besar. Jika efek ini tidak diinginkan, coba pendekatan persegi panjang bulat seperti di bawah ini. Dengan angka-angka kecil, persegi panjang masih akan terlihat seperti lingkaran karena jari-jarinya bertemu.

res / drawable / badge_circle.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
  <corners
    android:radius="10dip"/>
  <solid
    android:color="#F00" />
  <stroke
    android:width="2dip"
    android:color="#FFF" />
  <padding
    android:left="5dip"
    android:right="5dip"
    android:top="5dip"
    android:bottom="5dip" />
</shape>

Dengan latar belakang skalabel yang dibuat, Anda cukup menambahkannya ke latar belakang a TextView, seperti:

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" 
  android:text="10"
  android:textColor="#FFF"
  android:textSize="16sp"
  android:textStyle="bold"
  android:background="@drawable/badge_circle"/>

Terakhir, TextViewlencana ini dapat ditempatkan dalam tata letak Anda di atas tombol / tab yang sesuai. Saya mungkin akan melakukan ini dengan mengelompokkan setiap tombol dengan lencananya dalam sebuah RelativeLayoutwadah, seperti:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <Button
    android:id="@+id/myButton"
    android:layout_width="65dip"
    android:layout_height="65dip"/>
  <TextView
    android:id="@+id/textOne"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/myButton"
    android:layout_alignRight="@id/myButton" 
    android:text="10"
    android:textColor="#FFF"
    android:textSize="16sp"
    android:textStyle="bold"
    android:background="@drawable/badge_circle"/>
</RelativeLayout>

Mudah-mudahan informasi itu cukup untuk setidaknya mengarahkan Anda ke arah yang benar!

devunwired
sumber
Apakah mungkin melakukan sesuatu yang serupa dengan ini dengan TableLayout? Saya memiliki kisi tombol 2x2 dan tata letak relatif lebih merepotkan untuk disiapkan daripada tata letak relatif, namun saya tidak dapat menggunakan atribut seperti aligntTop dan alignRight
Nick
NM Saya menyelesaikannya hanya dengan meletakkan tata letak relatif di baris tabel! Terima kasih, kode berfungsi dengan baik
Nick
3
@FelipeMosso Gunakan ovalversi dari contoh dan tambahkan <size>elemen untuk memberikan proporsi untuk lebar / tinggi
devunwired
4
Ikon hitungan bersembunyi di balik tombol itu dalam kasus saya. Di Android 5.0. Tidak tahu apa yang salah. Dalam tata letak grafis, ini terlihat bagus tetapi tidak di perangkat.
Braj
1
Jika saya menggunakan Tombol untuk ikon hitungan, semuanya berfungsi dengan baik tetapi jika saya menggunakan Textview, tombol tersebut berada di belakang tombol utama alih-alih muncul di atas!
Braj
10

Android ViewBadger

Cara sederhana untuk "memberi lencana" pada tampilan Android tertentu saat waktu proses tanpa harus memenuhinya dalam tata letak.

Tambahkan .jarfile di folder libs Anda

Klik untuk mengunduh Contoh

lihat Contoh di github

Contoh sederhana:

View target = findViewById(R.id.target_view);
BadgeView badge = new BadgeView(this, target);
badge.setText("1");
badge.show();
Mansukh Ahir
sumber
4
Perpustakaan ini tidak digunakan lagi.
wonsuc
4

Retas paling sederhana dengan memberi gaya TextViewhanya.

        <TextView
                android:id="@+id/fabCounter"
                style="@style/Widget.Design.FloatingActionButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="10dp"
                android:padding="5dp"
                android:text="10"
                android:textColor="@android:color/black"
                android:textSize="14sp" />

Hasil

Aks4125
sumber
2

Hanya untuk menambahkan. Jika seseorang ingin menerapkan gelembung lingkaran berisi menggunakan bentuk cincin, bukan oval, berikut adalah contoh kode untuk menambahkan hitungan gelembung ke tombol bilah tindakan. Tetapi ini dapat ditambahkan ke tombol apa pun.

(beri nama bage_circle.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:useLevel="false"
    android:thickness="9dp"
    android:innerRadius="0dp"
    >

    <solid
        android:color="#F00"
        />
    <stroke
        android:width="1dip"
        android:color="#FFF" />

    <padding
        android:top="2dp"
        android:bottom="2dp"/>

</shape>

Anda mungkin harus menyesuaikan ketebalan sesuai kebutuhan Anda.

Hasilnya akan seperti ini:

masukkan deskripsi gambar di sini

Berikut tata letak tombol (beri nama badge_layout.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <com.joanzapata.iconify.widget.IconButton
        android:layout_width="44dp"
        android:layout_height="44dp"
        android:textSize="24sp"
        android:textColor="@color/white"
        android:background="@drawable/action_bar_icon_bg"
        android:id="@+id/badge_icon_button"/>

    <TextView
        android:id="@+id/badge_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/badge_icon_button"
        android:layout_alignRight="@id/badge_icon_button"
        android:layout_alignEnd="@id/badge_icon_button"
        android:text="10"
        android:paddingEnd="8dp"
        android:paddingRight="8dp"
        android:paddingLeft="8dp"
        android:gravity="center"
        android:textColor="#FFF"
        android:textSize="11sp"
        android:background="@drawable/badge_circle"/>
</RelativeLayout>

Dalam Menu buat item:

<item
        android:id="@+id/menu_messages"
        android:showAsAction="always"
        android:actionLayout="@layout/badge_layout"/>

Untuk onCreateOptionsMenureferensi ke item Menu:

    itemMessages = menu.findItem(R.id.menu_messages);

    badgeLayout = (RelativeLayout) itemMessages.getActionView();
    itemMessagesBadgeTextView = (TextView) badgeLayout.findViewById(R.id.badge_textView);
    itemMessagesBadgeTextView.setVisibility(View.GONE); // initially hidden

    iconButtonMessages = (IconButton) badgeLayout.findViewById(R.id.badge_icon_button);
    iconButtonMessages.setText("{fa-envelope}");
    iconButtonMessages.setTextColor(getResources().getColor(R.color.action_bar_icon_color_disabled));

    iconButtonMessages.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (HJSession.getSession().getSessionId() != null) {

                Intent intent = new Intent(getThis(), HJActivityMessagesContexts.class);
                startActivityForResult(intent, HJRequestCodes.kHJRequestCodeActivityMessages.ordinal());
            } else {
                showLoginActivity();
            }
        }
    });

Setelah menerima pemberitahuan untuk pesan, setel hitungannya:

itemMessagesBadgeTextView.setText("" + count);
itemMessagesBadgeTextView.setVisibility(View.VISIBLE);
iconButtonMessages.setTextColor(getResources().getColor(R.color.white));

Kode ini menggunakan Iconify-fontawesome .

compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.1.+'
Abdullah Umer
sumber
1

untuk orang-orang yang mencari Xamarin Android Bisa Menggunakan Kode Ini

public class CountDrawable : Drawable
{
    private float mTextSize;
    private Paint mBadgePaint;
    private Paint mTextPaint;
    private Rect mTxtRect = new Rect();

    private String mCount = "";
    private bool mWillDraw = false;


    public CountDrawable(Context context)
    {
        float mTextSize = context.Resources.GetDimension(Resource.Dimension.badge_count_textsize);
        mBadgePaint = new Paint();
        // mBadgePaint.SetCol(ContextCompat.GetColor(context.ApplicationContext, Resource.Color.background_color));
        mBadgePaint.Color = new Color(Color.Red);
        mBadgePaint.AntiAlias = true;
        mBadgePaint.SetStyle(Paint.Style.Fill);

        mTextPaint = new Paint();
        mTextPaint.Color = new Color(Color.White);
        mTextPaint.SetTypeface(Typeface.DefaultBold);
        mTextPaint.TextSize = mTextSize;
        mTextPaint.AntiAlias = true;
        mTextPaint.TextAlign = Paint.Align.Center;
    }


    public override void Draw(Canvas canvas)
    {
        if(!mWillDraw)
        {
            return;
        }



        Rect bounds = GetBounds;
        float width = bounds.Right - bounds.Left;
        float height = bounds.Bottom - bounds.Top;

        float radius = ((Math.Max(width, height) / 2)) / 2;
        float centerX = (width - radius - 1) + 5;
        float centerY = radius - 5;
        if (mCount.Length <= 2)
        {
            // Draw badge circle.
            canvas.DrawCircle(centerX, centerY, (int)(radius + 5.5), mBadgePaint);
        }
        else
        {
            canvas.DrawCircle(centerX, centerY, (int)(radius + 6.5), mBadgePaint);
        }

        mTextPaint.GetTextBounds(mCount, 0, mCount.Length, mTxtRect);
        float textHeight = mTxtRect.Bottom - mTxtRect.Top;
        float textY = centerY + (textHeight / 2f);
        if (mCount.Length > 2)
            canvas.DrawText("99+", centerX, textY, mTextPaint);
        else
            canvas.DrawText(mCount, centerX, textY, mTextPaint);
    }

    public Rect GetBounds { get; set; }


    public void setCount(String count)
    {
        mCount = count;

        // Only draw a badge if there are notifications.
       // mWillDraw = !count.equalsIgnoreCase("0");
        mWillDraw = !string.Equals(count, "0", StringComparison.OrdinalIgnoreCase);
       // invalidateSelf();
    }

    public override void SetAlpha(int alpha)
    {

    }

    public override void SetColorFilter(ColorFilter colorFilter)
    {

    }

    public override int Opacity
    {
        get;
    }

}

Dan di MainActivity

public override bool OnCreateOptionsMenu(IMenu menu)
    {
        // return base.OnCreateOptionsMenu(menu);
        MenuInflater.Inflate(Resource.Menu.actionmenu, menu);
        // var dd = menu.FindItem(Resource.Id.icon_group);
        IMenuItem item = menu.FindItem(Resource.Id.ic_group);
        LayerDrawable icon = item.Icon as LayerDrawable;

        // LayerDrawable icon = (LayerDrawable)item.Icon;
        CountDrawable badge;
        Drawable reuse = icon.FindDrawableByLayerId(Resource.Id.ic_group_count);
        if (reuse != null && reuse is CountDrawable)
        {
            badge = (CountDrawable)reuse;
        }
        else
        {
            badge = new CountDrawable(this);

        }
        badge.setCount("8");
        badge.GetBounds=icon.Bounds;

        icon.Mutate();
        icon.SetDrawableByLayerId(Resource.Id.ic_group_count, badge);
        return true;
    }
Ronak Shethia
sumber
bagaimana cara membuat lingkaran lebih kecil?
khalil
@khalil mencoba membuat menggunakan SkiaSharp
Ronak Shethia