0

I wrote a simple widget code. The button "Add TextView" creates TextView N1, N2, N3, the button "Set text in TextView N2" should change the text in TextView N2. How to change text in TextView N2 or get ID TextView N2?

MainActivity.java

package ru.test.widget;

import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button addTextView = findViewById(R.id.buttonAddTextView);
        addTextView.setOnClickListener(this);

        Button setText = findViewById(R.id.buttonSetText);
        setText.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonAddTextView:
                addTextView();
                break;
            case R.id.buttonSetText:
                setText();
                break;
        }
    }

    private void addTextView() {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
        ComponentName thisWidget = new ComponentName(this, AppWidget.class);
        int[] appWidgetId = appWidgetManager.getAppWidgetIds(thisWidget);

        RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.app_widget);
        for (int i = 0; i < 3; i++) {
            RemoteViews textView = new RemoteViews(getPackageName(), R.layout.text_view_layout);
            textView.setTextViewText(R.id.textView1, "TextView number " + String.valueOf(i));
            views.addView(R.id.appWidgetLinearLayout, textView);
        }
        appWidgetManager.updateAppWidget(appWidgetId, views);

    }

    private void setText() {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
        ComponentName thisWidget = new ComponentName(this, AppWidget.class);
        int[] appWidgetId = appWidgetManager.getAppWidgetIds(thisWidget);
        RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.app_widget);
        views.setTextViewText(R.id.textView1, "Text !!!!");
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

AppWidget.java

package ru.test.widget;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;

/**
 * Implementation of App Widget functionality.
 */
public class AppWidget extends AppWidgetProvider {

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        CharSequence widgetText = context.getString(R.string.appwidget_text);
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);
        views.setTextViewText(R.id.appWidgetText, widgetText);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }
}

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <Button
            android:id="@+id/buttonAddTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add TextView" />

        <Button
            android:id="@+id/buttonSetText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Set text in new TextView N2" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

app_widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/app_widget"
    android:initialLayout="@layout/app_widget"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen"></appwidget-provider>

app_widget.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#09C"
    android:padding="@dimen/widget_margin">
    <LinearLayout
        android:id="@+id/appWidgetLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:id="@+id/appWidgetText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_margin="8dp"
            android:background="#000000"
            android:text="@string/appwidget_text"
            android:textColor="#ffffff"
            android:textSize="8sp"/>
    </LinearLayout>
</RelativeLayout>

text_view_layout.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_margin="8dp"
    android:text="TextView"
    android:background="#7E2E2E"
    android:textColor="#ffffff"
    android:textSize="8sp"/>
Boken
  • 4,825
  • 10
  • 32
  • 42
Denis N
  • 3
  • 3

1 Answers1

0

The problem is that you can't iterate over childs of remoteviews. Since you're adding new elements to remoteview dynamically, you can't determine an exact child and change his properties. So there is two ways to achieve that you want.

  1. Make one remoteview with different ids for every textview and just update an exact id with partiallyUpdateAppWidget (you can read about this here).

  2. Make a listview in appwidget, and change content only in one item (read how to use appwidget with collection here)

HeyAlex
  • 1,666
  • 1
  • 13
  • 31