将新项目计数添加到按钮上的图标-Android
我是开发者。我需要实现如下所示的设计。我已经有了一款功能性应用程序,但我想知道如何实现这一点?特别是,我对如何在选项卡下显示“新”项目的数量感兴趣。我知道怎么做——就是用红点创建新图标,并在有新东西时显示它们 但我不知道如何让这些圆浮在标题的顶部,并在里面显示数字。有没有人对我们的目标有什么建议?样品?方向 关于分离活动的第二个问题。我是否应该控制这样的按钮组合,并在活动中对其进行充气?否则,我可能会创建选项卡式活动,但我不确定是否可以将其样式设置为这样将新项目计数添加到按钮上的图标-Android,android,android-layout,Android,Android Layout,我是开发者。我需要实现如下所示的设计。我已经有了一款功能性应用程序,但我想知道如何实现这一点?特别是,我对如何在选项卡下显示“新”项目的数量感兴趣。我知道怎么做——就是用红点创建新图标,并在有新东西时显示它们 但我不知道如何让这些圆浮在标题的顶部,并在里面显示数字。有没有人对我们的目标有什么建议?样品?方向 关于分离活动的第二个问题。我是否应该控制这样的按钮组合,并在活动中对其进行充气?否则,我可能会创建选项卡式活动,但我不确定是否可以将其样式设置为这样 将您的徽章设置为文本视图,允许您通过调用
将您的徽章设置为
文本视图
,允许您通过调用setText()
将数值设置为您喜欢的任何值。将文本视图
的背景设置为XML
可绘制,使用该背景可以创建带边框的实心或渐变圆。XML可绘制文件将根据视图的大小进行缩放,以适应更多或更少的文本
res/drawable/badge\u 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>
<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>
最后,这些TextView
徽章可以放置在相应按钮/选项卡顶部的布局中。我可能会通过在RelativeLayout
容器中将每个按钮与其徽章分组来实现这一点,如下所示:
<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"/>
<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>
希望这是足够的信息,至少让你指向正确的方向 Android ViewBadger 一种在运行时“标记”任何给定Android视图的简单方法,无需在布局中满足它 在libs文件夹中添加
.jar
文件
范例
参见github上的
简单的例子:
View target = findViewById(R.id.target_view);
BadgeView badge = new BadgeView(this, target);
badge.setText("1");
badge.show();
最简单的方法是只给
TextView
添加样式
<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" />
对于正在寻找Xamarin的人,Android可以使用此代码
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;
}
}
只是补充一下。如果有人想使用环形而不是椭圆形来实现填充圆气泡,下面是将气泡计数添加到操作栏按钮的代码示例。但这可以添加到任何按钮 (命名为bage_circle.xml): 在“创建项目”菜单中:
<item
android:id="@+id/menu_messages"
android:showAsAction="always"
android:actionLayout="@layout/badge_layout"/>
收到消息通知后,设置计数:
itemMessagesBadgeTextView.setText("" + count);
itemMessagesBadgeTextView.setVisibility(View.VISIBLE);
iconButtonMessages.setTextColor(getResources().getColor(R.color.white));
此代码使用
是否可以使用TableLayout执行类似的操作?我有一个2x2的按钮网格,相对布局比相对布局更难设置,但是我不能使用像aligntTop和alignRightNM这样的属性,我只是将相对布局放在表行中就解决了这个问题!谢谢,代码有效great@FelipeMosso使用示例的
oval
版本,添加
元素以提供隐藏在按钮后面的宽度/高度计数图标的比例。在安卓5.0上。不知道怎么了。在图形布局中,它看起来不错,但在设备中并没有。若我使用按钮作为计数图标,一切正常,但若我使用文本视图,它会位于主按钮后面,而不是显示在顶部!此库已弃用。如何使圆变小?@khalil尝试使用SkiaSharp创建
<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>
<item
android:id="@+id/menu_messages"
android:showAsAction="always"
android:actionLayout="@layout/badge_layout"/>
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();
}
}
});
itemMessagesBadgeTextView.setText("" + count);
itemMessagesBadgeTextView.setVisibility(View.VISIBLE);
iconButtonMessages.setTextColor(getResources().getColor(R.color.white));
compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.1.+'