Android: Можно ли обновить ImageView/ImageButton с номером, чтобы показать количество новых сообщений?

В iOS у нас есть функция обновления значка приложения с новыми ожидающими сообщениями для пользователя, показав небольшое число в правом верхнем углу значка, и аналогичным образом я хотел бы знать, есть ли у нас метод обновления ImageView/ImageButton в android (здесь я не хочу обновлять значок на главном экране, но внутри своего приложения).

Например, на pic отображается значок красного фона с количеством сообщений, ожидающих чтения красным цветом, и если нет сообщений, которые он показывает с серым фоном.

enter image description here

Спасибо,

Ответ 1

Мне это было интересно, потому что я не знал, как это сделать. Поэтому я начал изучать его, и вот как я это сделал.

  • Я не специалист по пользовательскому интерфейсу, поэтому в следующем XML файле может быть что-то бесполезное/неправильное.
  • Из того, что я сказал выше, мне не удалось подсчитать значение в правом нижнем углу значка.:)
  • Для теста я использую стандартный icon.png из sdk

Рез/вытяжка/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>

Рез/макет/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_width="wrap_content"
    android:layout_height="wrap_content">

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

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
        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_width="wrap_content" android:layout_height="wrap_content"
    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 файле, например, для деятельности. Однако есть некоторые правила. См. Ссылку для руководства

В этой ссылке, которая показывает вам, как построить 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

EDIT:

См. ниже тест активности, если подсчет, который вы хотите, должен находиться в 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);
    }
}

Ответ 2

Как вы хотите сделать это внутри своего приложения, а не на главном экране, я бы предложил вам просто создать подкласс ImageView и переопределить onDraw() - сделать любую фоновую роспись, вызвать super.onDraw(), затем сделайте рисование переднего плана.

В качестве альтернативы вы можете использовать Bitmap.copy и т.д. для создания составного изображения с значка базы и меньшего растрового изображения с количеством сообщений.

Надеюсь, что это поможет,

Фил Лелло