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

问题描述:

我正在创建一个天气小工具。第一次将小工具拖到主屏幕时,配置屏幕应该出现三个代表三个城市的按钮。当用户点击一个按钮(比如哥本哈根)时,我希望字符串“哥本哈根”被转移到Widget本身,所以它可以去Fetech天气哥本哈根的数据并将其显示给用户。是什么?将小部件配置屏幕中的字符串传输到AppWidget本身?

AppWidget配置屏幕

Configuration screen

构件屏幕

Widget screen

我会解释它使用SharedPreferences的解决方案。

  1. 您确实需要两个java文件。一个App Widget配置活动(我称之为配置)和一个AppWidgetProvider(我称之为WeatherWidget)。您将需要两个xml文件,定义配置活动和小部件(我称之为我的activity_configure.xml和weather_widget.xml)的布局。

  2. 您将需要一个清单文件,也是一个小部件信息文件(IVE打电话给我weather_widget_info

enter image description here

下面是从配置

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

}