通过 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的主要内容,如果未能解决你的问题,请参考以下文章