Получить данные из другого действия в виджет приложения - PullRequest
2 голосов
/ 24 сентября 2011

Привет. У меня есть мероприятие 1, которому нужно отправить данные в Appwidget (виджет), в котором есть текстовое представление.

Для отправки данных между активами я знаю, что мы можем использовать intent.putExtra("mydata", dataString); и получать то же самое с String data = bundle.getString("mydata"); Но в моем случае мне нужно отправить данные (String) в приложение Widget.

Когда я использую

Bundle dataFromPrevious = getIntent().getExtras();
String newString = dataFromPrevious.getString("mydata");

внутри AppWidgetProvider он выдает ошибку в getIntent, говоря, что getIntent не определен для типа Class.

Как я могу получить строку внутри этого AppWidget? Кроме того, этот текст будет обновляться в упражнении 1 новой строкой, поэтому использование SharedPrefrences является хорошим выбором для этой ситуации? Есть ли другой способ?

ОБНОВЛЕНИЕ 1:

Как упомянул Иосиф, я добавил <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> в моем манифесте

Теперь я также создал переопределение OnRecieve в AppWidget

@Override
    public void onReceive(Context context, Intent intent) {

        Bundle getPrevData = intent.getExtras();
        String data = getPrevData.getString("mydata");
        newdata = data;
        super.onReceive(context, intent);
    }

В моем обновлении у меня есть

views.setTextViewText(R.id.dataWidget,newdata);

Здесь newdata - это public static String Но это ничего не отображает !!! когда я устанавливаю TextViewText для просмотра текста в виджете. Я что-то здесь упускаю? Пожалуйста, помогите ...

ОБНОВЛЕНИЕ 2:

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;
import android.widget.Toast;

public class MainWidget extends AppWidgetProvider {

    private RemoteViews views;
    public static String newdata

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle getPrevData = intent.getExtras();
        String data = getPrevData.getString("mydata");
        newdata = data;

        super.onReceive(context, intent);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        views = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
        appWidgetManager.updateAppWidget(appWidgetIds, views);

        //views.setTextViewText(R.id.dataWidget,newdata);

        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }


}

А это моя другая активность, которая отправляет данные:

final String text = ((TextView)findViewById(R.id.textview)).getText().toString();
Intent intent = new Intent(FirstActivity.this, MainWidget.class);
                intent.putExtra("mydata", text);

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Вам нужно использовать BroadcastReceiver с. В двух словах: добавьте BroadcastReceiver к вашему AppWidgetProvider, который действует на пользовательский Intent, а затем обновите ваши виджеты.

Из вашего Activity все, что вам нужно сделать, это отправить широковещательную рассылку (Context.sendBroadcast) с пользовательским намерением (и вы можете добавить данные к Intent с putExtra как обычно).

0 голосов
/ 02 октября 2011

Вы можете обновить данные в виджете без использования приемника вещания.

  1. Сохранение данных в sharedPreference.

  2. Создание удаленных представлений с использованием новых данных и использование AppWidgetManager.updateWidget для обновления виджета.

Вот пример кода.

RemoteViews updateViews = buildUpdate(context); // Update the view using the new data.
ComponentName thisWidget = new ComponentName(context, WidgetClassName.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thisWidget, updateViews);

Это то, что я делал в моем предыдущем заявлении.

Saneesh CS

...