2
我正在創建一個天氣小工具。第一次將小工具拖到主屏幕時,配置屏幕應該出現三個代表三個城市的按鈕。當用戶點擊一個按鈕(比如哥本哈根)時,我希望字符串「哥本哈根」被轉移到Widget本身,所以它可以去Fetech天氣哥本哈根的數據並將其顯示給用戶。是什麼?將小部件配置屏幕中的字符串傳輸到AppWidget本身?
AppWidget配置屏幕
構件屏幕
我正在創建一個天氣小工具。第一次將小工具拖到主屏幕時,配置屏幕應該出現三個代表三個城市的按鈕。當用戶點擊一個按鈕(比如哥本哈根)時,我希望字符串「哥本哈根」被轉移到Widget本身,所以它可以去Fetech天氣哥本哈根的數據並將其顯示給用戶。是什麼?將小部件配置屏幕中的字符串傳輸到AppWidget本身?
AppWidget配置屏幕
構件屏幕
我會解釋它使用SharedPreferences的解決方案。
您確實需要兩個java文件。一個App Widget配置活動(我稱之爲配置)和一個AppWidgetProvider(我稱之爲WeatherWidget)。您將需要兩個xml文件,定義配置活動和小部件(我稱之爲我的activity_configure.xml和weather_widget.xml)的佈局。
您將需要一個清單文件,也是一個小部件信息文件(IVE打電話給我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;
}
}