我今天学到了如何开发AppWidget,我的问题是,如何在app小部件中运行方法? 例: 我在xml中有一个按钮,我希望按钮计算一些东西。 - 创建小部件的部分工作正常,现在我想添加一些方法到按钮。 它是如何在" App Widgets"?
中运作的这是我的代码:
public class WorkClockWidget extends AppWidgetProvider {
MySharedPreferences shared;
RemoteViews views;
private Context context;
private String text;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
for (int i = 0; i < appWidgetIds.length; i++) {
views = new RemoteViews(context.getPackageName(), R.layout.clock_widget);
/// i have button in the "R.layout.clock_widget" .
//what i need to do if i want the button run the "someText()" method?
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
}
//The method i want to run when i press on the button.
public String someText(){
System.out.println("Works!!!");
return "Test if this method works";
}
}
还有一个问题: 如果我希望我的小部件将数据添加到我的数据库,我必须使用contentProvider?
答案 0 :(得分:0)
您无法直接调用方法,但可以触发Intent。一种方法是使用PendingIntent.getBroadcast让Intent发送广播。 (我不确定你是否需要这个类别,但这就是我在自己的代码中如何做到这一点,所以我在这个例子中包括它。)
Intent intent = new Intent("com.myapp.button_press").addCategory("com.myapp");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.widget_button, pendingIntent);
接下来,您需要BroadcastReceiver才能接收该广播。一个偷偷摸摸的方法是使用你的AppWidgetProvider类作为接收器,因为那是一个app小部件。您必须修改应用小部件的清单条目,以包含您在onUpdate中创建的Intent:
<receiver android:name=".widget.MintAppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="com.myapp.button_press"/>
<category android:name="com.myapp"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_provider_info"/>
</receiver>
此外,当你覆盖onReceive时,如果Intent不是你的特殊Intent,请务必调用super.onReceive,以便基本AppWidgetProvider类可以处理正常意图并调用onUpdate。
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if ("com.myapp.button_press".equals(action)) {
// First handle your special intent action
someText();
} else {
// otherwise let Android call onUpdate
super.onReceive(context, intent);
}
}