2

I am creating a Weather Widget.The first time I drag the widget to the home screen a configuration screen should appear with three buttons representing three cities. When the user clicks on a button (say Copenhagen) I want the string "Copenhagen"" to be transfered to the Widget itself, so It can go and fetech weather data of the Copenhagen and show it to the user. How do I actually acomplish that?

AppWidget Configuration screen

Configuration screen

Widget Screen

Widget screen

4

1 回答 1

0

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

  1. 您确实需要两个 java 文件。一个 App Widget Configuration Activity(我称之为 Configure)和一个 AppWidgetProvider(我称之为 WeatherWidget)。

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

  3. 您将需要一个清单文件和一个小部件信息文件(我叫我的 weather_widget_info

在此处输入图像描述

这是配置中的相关代码

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;
}

}


</p>

于 2016-01-04T13:57:53.037 回答