将小部件配置屏幕中的字符串传输到AppWidget本身?

时间:2016-01-01 13:57:33

标签: android configuration widget transfer info

我正在创建一个天气小工具。第一次将小工具拖到主屏幕时,配置屏幕应显示三个按钮代表三个城市。当用户点击一个按钮(比如哥本哈根)时,我希望将字符串“Copenhagen”“转移到Widget本身,这样它就可以和哥本哈根的fetech天气数据一起显示给用户。我该如何实现是什么?

AppWidget配置屏幕

Configuration screen

小部件屏幕

Widget screen

1 个答案:

答案 0 :(得分:0)

我将解释使用SharedPreferences的解决方案。

  1. 您确实需要两个java文件。应用程序小部件配置活动(我称之为我的配置)和AppWidgetProvider(我称之为我的WeatherWidget)。

  2. 您将需要两个xml文件,定义Configuration活动和小部件的布局(我称之为mine activity_configure.xml和weather_widget.xml)。

  3. 您需要一个清单文件以及一个小部件信息文件(我称之为我的weather_widget_info

  4. enter image description here

    以下是Configure

    中的相关代码
    public class Configure extends AppCompatActivity {
        private int widgetID;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_configure);
    
        // if the user hits back button
        setResult(RESULT_CANCELED);
    
        // get widgetID for this widget instance
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            widgetID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        }
    
        Button copenhagenButton = (Button) findViewById(R.id.copenhagenButton);
        copenhagenButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveData("Copenhagen");
                resultOK();
            }
        });
    
        Button stockholmButton = (Button) findViewById(R.id.stockholmButton);
        stockholmButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveData("Stockholm");
                resultOK();
            }
        });
    
        Button osloButton = (Button) findViewById(R.id.osloButton);
        osloButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveData("Oslo");
                resultOK();
            }
        });
    
    }
    
    private void saveData(String cityName) {
        String widgetIDString = Integer.toString(widgetID);
        SharedPreferences prefs = this.getSharedPreferences(widgetIDString, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.putString("city", cityName);
        edit.commit();
    }
    
    private void resultOK() {
    
        // send an onUpdate() message to the widget via a broadcast
        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, WeatherWidget.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetID});
        sendBroadcast(intent);
    
        // signal OK
        Intent resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID);
        setResult(RESULT_OK, resultValue);
        finish();
    }
    

    }

    以下是WeatherWidget的相关代码

    public class WeatherWidget extends AppWidgetProvider {
    final static String TAG = "stille";
    private int widgetID;
    private String city="N/A";
    RemoteViews views;
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            widgetID = appWidgetIds[i];
            loadCity(context);
            views = new RemoteViews(context.getPackageName(), R.layout.weather_widget);
            views.setTextViewText(R.id.location, city);
            appWidgetManager.updateAppWidget(widgetID, views);
        }
    }
    
    private void loadCity(Context context) {
        String widgetIDString = Integer.toString(widgetID);
        SharedPreferences prefs = context.getSharedPreferences(widgetIDString, Context.MODE_PRIVATE);
        String cityName = prefs.getString("city", "N/A ");
        city = cityName;
    }
    

    }