Android:是不是可以使用数字更新 ImageView/ImageButton 以显示新消息的数量?

Posted

技术标签:

【中文标题】Android:是不是可以使用数字更新 ImageView/ImageButton 以显示新消息的数量?【英文标题】:Android: Is it possible to update a ImageView/ImageButton with a number to show the number of new messages?Android:是否可以使用数字更新 ImageView/ImageButton 以显示新消息的数量? 【发布时间】:2011-07-30 23:50:52 【问题描述】:

ios 中,我们有一项功能可以通过在图标右上角显示一个小数字来使用新的待处理消息为用户更新应用程序图标,同样我想知道我们是否有方法更新android中的ImageView/ImageButton(这里我不想更新主屏幕上的图标,而是在我的应用程序内部)。

例如,图片显示红色背景图标,红色背景显示待读消息的数量,如果没有消息,则显示灰色背景。

谢谢,

【问题讨论】:

某些应用程序正是这样做来存储 gmail 或 SMS 应用程序。不过我不知道他们是怎么做到的。 【参考方案1】:

我对此很感兴趣,因为我也不知道该怎么做。所以我开始研究它,这就是我的做法。

我不是 UI 专家,因此以下 XML 中可能存在一些无用/错误的内容。 根据我上面所说的,我没有设法在图标的右下角进行计数。 :) 为了测试,我使用来自 sdk 的标准 icon.png

res/drawable/shapecount.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
  <corners android:radius="20dp"  />    
  <solid android:color="#ff2233" />
</shape>

res/layout/my_widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_
    android:layout_>

<RelativeLayout
    android:orientation="vertical"
    android:background="@null"
    android:id="@+id/rlayout"
    android:layout_
    android:layout_ >
    <ImageView 
            android:id="@+id/icon"
            android:src="@drawable/icon" 
            android:layout_margin="0dp"
            android:layout_ 
            android:layout_/>

    <TextView android:layout_ android:layout_
        android:text="50" android:textSize="9dp" android:textStyle="bold"  
        android:background="@drawable/shapecount"
        android:textColor="#FFFFFF"
        android:paddingLeft="3dp" android:paddingRight="3dp"
            android:layout_margin="0dp"
        android:layout_alignBottom="@+id/rlayout"
        android:id="@+id/txtCount" />

</RelativeLayout>

<TextView android:layout_ android:layout_
    android:text="My App Name" android:textSize="9dp" android:textStyle="bold"  
    android:background="@drawable/shapecount"
    android:textColor="#FFFFFF"
    android:paddingLeft="3dp" android:paddingRight="3dp"
        android:layout_margin="0dp"
    android:layout_alignBottom="@+id/rlayout"
    android:id="@+id/txtAppName" />
 </LinearLayout>

主页小部件实际上是一个普通视图,您可以像构建活动一样在 XML 文件中构建它。不过有一些规则需要遵守。有关指南,请参阅此link

在这个link 向您展示了如何构建一个AppWidget,您可以看到以下代码:

// Get the layout for the App Widget and attach an on-click listener to the button
  RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);

其中R.layout.appwidget_provider_layout 是您的主页小部件的布局,即my_widget_layout.xml

views,您可以为任何计数文本视图设置所需的值:

int count = 50;//Or whatever value you set to it.
views.setTextViewText(R.id.txtCount,Integer.toString(count));

然后你只需要更新小部件本身:

appWidgetManager.updateAppWidget(appWidgetId, views);

注意:

updatePeriodMillis 不允许小部件每 30 分钟请求更新一次以上,因此我使用了 BroadcastReceiver 和 Service 的组合

编辑:

如果您想要的计数应该在 Activity 而不是 AppWidget 内,请参阅下面的活动测试。它使用与上述相同的 XML:

public class TestActivity extends Activity 
    /** Called when the activity is first created. */

    final Random gen = new Random();


    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final TextView t = (TextView) findViewById(R.id.txtCount);

        Timer timer = new Timer();
        timer.schedule(new TimerTask() 

            @Override
            public void run()  
                runOnUiThread(new Runnable() 

                    @Override
                    public void run() 
                        int a = gen.nextInt(20);
                        t.setText(Integer.toString(a));                     
                    
                );
                
            
        ,new Date(), 3000L);
    

【讨论】:

此布局格式不正确,您要更新此代码一次吗? 你所说的“格式不正确”是什么意思? LinearLayout 格式不正确。但是,在这里我正在寻找更新应用程序内的 ImageView 而不是在主屏幕上。 好的,&lt;LinearLayout&gt; 开始标签丢失了。只需添加 &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"&gt; 即可。它应该可以在普通应用程序中运行(未测试,因为我现在没有任何环境)【参考方案2】:

当您希望在您的应用程序中而不是在主屏幕上执行此操作时,我建议您创建一个 ImageView 子类,并覆盖 onDraw() - 进行任何背景绘制,调用 super.onDraw(),然后画前景。

或者,您可以使用 Bitmap.copy 等从基本图标构建合成图像,以及带有消息计数的较小位图。

希望对你有帮助,

菲尔·莱洛

【讨论】:

任何可能的sn-ps?因为我从来没有在任何时候画过图像。

以上是关于Android:是不是可以使用数字更新 ImageView/ImageButton 以显示新消息的数量?的主要内容,如果未能解决你的问题,请参考以下文章

Android开源框架Image-Loader详解

Android OS的image文件组成

Android开源框架Image-Loader详解

使用 PIL 获取像素的 RGB

在 ImageView 上设置负边距会移动 ImageView 但不是 Image

Android求解,求一个判断是不是为数字的正则表达式,要求全是数字,不能有特殊符号,汉字,字母,小数也不行