【问题标题】:Getting a String to AppWidget via GetExtras (or) Shared prefrences通过 GetExtras(或)共享首选项获取字符串到 AppWidget
【发布时间】: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) 任何人都可以帮助我了解如何显示字符串的基本想法 这里。请。提前致谢。

【问题讨论】:

    标签: android android-widget sharedpreferences android-appwidget


    【解决方案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 也可能会导致竞争条件。
    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2019-09-30
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多