通过 GetExtras(或)共享首选项获取字符串到 AppWidget

Posted

技术标签:

【中文标题】通过 GetExtras(或)共享首选项获取字符串到 AppWidget【英文标题】:Getting a String to AppWidget via GetExtras (or) Shared prefrences 【发布时间】:2011-11-25 11:49:19 【问题描述】:

我有一个应用程序,它基本上有一个文本视图。我也有 一个活动,它显示来自其中创建的字符串的文本视图。现在 我在活动 1 中有一个按钮,onClick 将发送数据(字符串到 appWidget 类)我尝试了 putExtra 和 getExtra 方法以及 Shared 偏好方法,我有点困惑首先使用哪个!

为了更清楚,这里是我的一些输入。 活动1:

final String addwidget =
((TextView)findViewById(R.id.verse)).getText().toString();
Intent widgetIntent = new Intent(MyScheduledActivity.this,
MainWidget.class);
widgetIntent.putExtra("widgetVerse", addwidget);

AppWidget:

public class MainWidget extends AppWidgetProvider 

       RemoteViews views;
       public static String verseFromFav;
       private Bundle getVerseData;

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

               getVerseData = intent.getExtras();
               verseFromFav = getVerseData.getString("widgetVerse");
               super.onReceive(context, intent);
       

       @Override
       public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
          final int N = appWidgetIds.length;
          for (int i=0; i<N; i++) 

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

          if(verseFromFav == null)
               verseFromFav = "no verse";
          
          views.setTextViewText(R.id.widgetVerse, verseFromFav);

          ComponentName thisWidget = new ComponentName( context, MainWidget.class );

AppWidgetManager.getInstance( context ).updateAppWidget( thisWidget, views );

         appWidgetManager.updateAppWidget(appWidgetIds, views);

         
         super.onUpdate(context, appWidgetManager, appWidgetIds);
       

(应用程序小部件显示“无诗句”,其内容为 NULL) 任何人都可以帮助我了解如何显示字符串的基本想法 这里。请。提前致谢。

【问题讨论】:

【参考方案1】:

onUpdate 总是会被调用(有时是多次),所以利用它来触发实用程序或控制器类并完成该类中的所有工作。

因此,在您的应用小部件中,您可能拥有的唯一东西(我所演示的只是更新 TextView 中的字符串)就是 onUpdate() 方法中的内容。

@Override
public void onUpdate( final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds ) 
    // Need this here to set the initial state of the app widget
    final AppWidgetController _actrlr = new AppWidgetController( context );
    _actrlr.updateAppWidgetUI( this );

    super.onUpdate( context, appWidgetManager, appWidgetIds );

那么在 AppWidgetController 类中你可能会有这样的东西......

public final void updateAppWidgetUI( final Context context ) 

        final AppWidgetManager _manager = AppWidgetManager.getInstance( context  );
        final ComponentName _componentName = new ComponentName( context, com.your.namespace.theprovidername.class );
        final int[] appWidgetIds = _manager.getAppWidgetIds( _componentName );

        for ( final int i : appWidgetIds ) 

            final RemoteViews _rv = new RemoteViews( context.getPackageName(), R.layout.appwidget_xml_layout_file );

            if( somethingIsTrue ) 
                _rv.setTextViewText( R.id.textViewThatYouWantToUpdate, "The text that you wish to display if something is TRUE" );
             else 
                _rv.setTextViewText( R.id.textViewThatYouWantToUpdate, "The text that you wish to display if something is FALSE" );
            

            _manager.updateAppWidget( i, _rv );
        
    

远程视图 setTextViewText()

http://developer.android.com/reference/android/widget/RemoteViews.html#setTextViewText(int, java.lang.CharSequence)

【讨论】:

已编辑,因为我在从我自己的应用程序复制和粘贴时忘记将 setInt 更改为 setTextViewText【参考方案2】:

我建议您为此使用 sharedpreference。这样做会更好。

SharedPreferences settings =  
getSharedPreferences("MyWigdetPreferences", MODE_WORLD_READABLE);  

SharedPreferences.Editor prefEditor = Settings.edit();  
prefEditor.putString("widgetVerse", addwidget);    
prefEditor.commit();  

然后在 mainWidget 活动中将其拉出..

  SharedPreferences settings =  
getSharedPreferences("MyWigdetPreferences", MODE_WORLD_READABLE);  
 String verse = settings.getString("widgetVerse");

应该可以的。

编辑:

代替

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

           getVerseData = intent.getExtras();
           verseFromFav = getVerseData.getString("widgetVerse");
           super.onReceive(context, intent);
   

试试

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

           getVerseData = getIntent.getExtras();
           verseFromFav = getVerseData.getString("widgetVerse");
           super.onReceive(context, intent);
   

【讨论】:

您好,感谢您的快速响应:) 我应该在 MainWidget 的哪个位置提取它? (请注意:MainWidget 不是一个活动,它是 AppWidgetProvider,第二个代码在那里不起作用!,有什么帮助吗? 恐怕它也会引发错误,我之前也使用过 get 和 put extras,您更新的代码在 Activity 类上运行良好,但一直搜索我可以看到 AppWidget 通常部署为一个只读接口,它充当底层活动的店面。我在 getIntent 中收到错误“getIntent 无法解析。 您需要创建一个“控制器”......您的应用小部件和数据之间的中间体。如果您动态更新字符串,使用 SharedPreferences 也可能会导致竞争条件。

以上是关于通过 GetExtras(或)共享首选项获取字符串到 AppWidget的主要内容,如果未能解决你的问题,请参考以下文章

如何保存和获取存储在共享首选项中的包名称?

添加值后增加共享首选项键

在共享首选项中获取文件大小

未在服务中获取共享首选项的更新值

如何使用 dart/flutter 中的共享首选项保存和获取列表列表

如何使用共享首选项来保存从数据库获取的数据? [复制]