【问题标题】:Sharedpreferences does not work with appWidgetProvider (getApplicationContext is undefined)Sharedpreferences 不适用于 appWidgetProvider(getApplicationContext 未定义)
【发布时间】:2012-05-09 05:34:56
【问题描述】:

我正在创建一个小部件,它将从数据库中为用户显示一些数据。其中一个数据取决于可以在我的设置活动中设置的参数。我用 sharedpreferences 保存这个参数,这样我就可以在我的代码中的任何地方使用它。 在一个活动中,我可以使用 getApplicationContext,但在这里我告诉小部件要做什么,它不起作用。我应该使用什么来代替 getApplicationContext?

更新

public class plWidget extends AppWidgetProvider{

    SharedPreferences sharedPreferences;
     String loadedWeightType;

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onDeleted(context, appWidgetIds);
        Toast.makeText(context, "deleted", 2500).show();
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);

         String Wcal="0",Wfat="0",Wprot="0",Wcarb="0",Wsport="0";

         final int N = appWidgetIds.length;

         for (int i = 0;i<N;i++)
        {
            int awID = appWidgetIds[i];
            updateAppWidget(context, appWidgetManager, appWidgetIds[i]);

            GlobalVars.setSulyType(loadedWeightType);           
        Log.i("SULYYYY", GlobalVars.getSulyType());

        long now = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date resultdate = new Date(now);
        Log.i("ASAS", sdf.format(resultdate));


        hornot database = new hornot(context);
        database.open();



         int ccc = database.checkDataExists(sdf.format(resultdate), sdf.format(resultdate));
        if (ccc==0){
            Log.i("nulla", "0");
            Log.i("nulla", GlobalVars.getSulyType());

            Wcal="0";
            Wfat="0";
            Wprot="0";
            Wcarb="0";
        }

        else{

        database.getDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
         Wcal = GlobalVars.getSums();

        database.FATgetDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
         Wfat = GlobalVars.getSums();

        database.PROTEINgetDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
         Wprot = GlobalVars.getSums();

        database.CARBSgetDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
         Wcarb = GlobalVars.getSums();

                }

        int ddd = database.checkDataExistsSports(sdf.format(resultdate), sdf.format(resultdate));
        if (ddd==0){
            Wsport="0";

        }
        else{

            if (loadedWeightType.equals("kilogramm"))
                    {
            database.SportgetDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
            // Wsport = GlobalVars.getSums();
             Wsport= "kilogramm";


                    }
            else if (loadedWeightType.equals("pound"))
                    {
            database.SportgetDateFromAndToFromDatePicker(sdf.format(resultdate), sdf.format(resultdate));
            Wsport="pound";
                    }

        }

        RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget);
        v.setTextViewText(R.id.tvwidgetUpdate, Wcal+Wfat+Wprot+Wcarb+Wsport);
        appWidgetManager.updateAppWidget(awID, v);
        database.close();



        }


    }

    public void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 
        SharedPreferences prefs = context.getSharedPreferences(plWidget.class + Integer.toString(appWidgetId),
                Context.MODE_WORLD_READABLE);
         loadedWeightType= prefs.getString("weighttype", "kilogramm");
    }

}

提前致谢!

更新

像往常一样,我执行加载功能:

 public void LoadWeightType(){
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        loadedWeightType= sharedPreferences.getString("weighttype", "kilogramm");
      }

在正常活动中,我可以加载重量类型。我想 updateAppWidget 函数应该以某种方式替换这个函数。

【问题讨论】:

  • getSharedPreferences 在我的情况下不起作用:无法从 PreferenceManager 类型对非静态方法 getSharedPreferences() 进行静态引用

标签: android widget sharedpreferences


【解决方案1】:
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
SharedPreferences prefs = context.getSharedPreferences(MyConfigActivity.NAME + Integer.toString(appWidgetId), Context.MODE_WORLD_READABLE);

我从 onUpdate 为我的小部件的每个实例调用 updateAppWidget,并传入参数。传入的 Context 定义了 getSharedPreferences,我根据配置活动的名称和小部件的 id 指定要获取哪组首选项。这是 getSharedPreferences 函数的 sdk 参考:http://developer.android.com/reference/android/content/Context.html#getSharedPreferences%28java.lang.String,%20int%29

【讨论】:

  • 哇。我在我留下的第五条评论附近收到一条弹出消息,建议将其用于聊天并避免长时间的评论对话,但 Android 聊天已设置,因此您只能在获得批准的情况下聊天。如果有人删除了他们,我希望他们能对此发表评论。但无论如何,除了确保您的小部件和活动是同一应用程序的一部分并确保您使用用于检索它们的相同密钥存储您的偏好之外,我不确定还有什么建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2014-02-05
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多