简体   繁体   English

如何在新的文本视图中更改窗口小部件的文本?

[英]How do I change the text of a widget in a new textview?

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. 按钮“添加TextView”创建TextView N1,N2,N3,按钮“在TextView N2中设置文本”应该更改TextView N2中的文本。 How to change text in TextView N2 or get ID TextView N2? 如何在TextView N2中更改文本或获取ID TextView N2?

MainActivity.java 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 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 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 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 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 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"/>

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. 由于您要动态地向remoteview添加新元素,因此无法确定精确的子元素并更改其属性。 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 ). 为每个textview创建一个具有不同id的remoteview,并使用partiallyUpdateAppWidget更新一个完全id(你可以在这里阅读)。

  2. Make a listview in appwidget, and change content only in one item (read how to use appwidget with collection here ) 在appwidget中创建一个listview,只在一个项目中更改内容( 在这里阅读如何使用appwidget与集合)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM