几个按钮的 Android 小部件 onclick 侦听器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23220757/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android widget onclick listener for several buttons
提问by Zapnologica
I am trying to create a widget for my application. From my reading an android developer site your onclick listeners all need to have an Intent. But what if I just want my button to update data in the widget itself and I don't want to start a new activity?
我正在尝试为我的应用程序创建一个小部件。从我阅读一个 android 开发者网站来看,您的 onclick 监听器都需要有一个 Intent。但是,如果我只想让我的按钮更新小部件本身中的数据,而不想开始新活动怎么办?
Here is some Android demo code:
这是一些Android演示代码:
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
I want a button that when I click makes a http web call and then displays the results in the widget. How do I go about doing this if I have to use intents? Also I need to be able to differentiate between which buttons where clicked.
我想要一个按钮,当我点击它时会进行 http 网络调用,然后在小部件中显示结果。如果我必须使用意图,我该怎么做?此外,我需要能够区分点击了哪些按钮。
Why do widgets use intents and not the normal onclick listener where it calls a function like activities?
为什么小部件使用意图而不是普通的 onclick 侦听器,它调用诸如活动之类的函数?
EDIT
编辑
My widget provider:
我的小部件提供商:
public class MyWidgetProvider extends AppWidgetProvider {
private static final String MyOnClick1 = "myOnClickTag1";
private static final String MyOnClick2 = "myOnClickTag2";
private static final String MyOnClick3 = "myOnClickTag3";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// Get all ids
ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm, getPendingSelfIntent(context, MyOnClick1));
remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm, getPendingSelfIntent(context, MyOnClick2));
remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm, getPendingSelfIntent(context, MyOnClick3));
remoteViews.setTextViewText(R.id.widget_textview_gpscoords, "gps cords");
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
@Override
public void onReceive(Context context, Intent intent) {
if (MyOnClick1.equals(intent.getAction())) {
// your onClick action is here
Toast.makeText(context, "Button1", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button1");
} else if (MyOnClick2.equals(intent.getAction())) {
Toast.makeText(context, "Button2", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button2");
} else if (MyOnClick3.equals(intent.getAction())) {
Toast.makeText(context, "Button3", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button3");
}
};
}
My Android manifest:
我的 Android 清单:
<receiver
android:name="widget.MyWidgetProvider"
android:icon="@drawable/fsk"
android:label="FSK Widget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
回答by canova
It is possible to make an onClick event for Views in Widgets. You can create as many onClick events as you want.
可以为小部件中的视图创建一个 onClick 事件。您可以根据需要创建任意数量的 onClick 事件。
On top of your Widget class, create a static variable, which will be your onClick name tag:
在您的 Widget 类之上,创建一个静态变量,这将是您的 onClick 名称标签:
private static final String MyOnClick = "myOnClickTag";
Define a helper method to automate the creation of each PendingIntent
:
定义一个辅助方法来自动创建每个PendingIntent
:
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
Set this onClick tag to your view as below:
将此 onClick 标记设置为您的视图,如下所示:
remoteViews.setOnClickPendingIntent(R.id.button,
getPendingSelfIntent(context, MyOnClick));
create an onReceive method in your Widget class and set this onClick event inside it:
在您的 Widget 类中创建一个 onReceive 方法并在其中设置此 onClick 事件:
public void onReceive(Context context, Intent intent) {
if (MyOnClick.equals(intent.getAction())){
//your onClick action is here
}
};
Whenever the view that you set the tag is pressed, onReceive will capture that and will do the action just the same as our everyday, standard onClick event.
每当您设置标签的视图被按下时,onReceive 将捕获它并执行与我们日常的标准 onClick 事件相同的操作。
Edit: According to your answer, can you replace your onUpdate content with following lines and try again:
编辑:根据您的回答,您能否用以下几行替换您的 onUpdate 内容并重试:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_det);
thisWidget = new ComponentName(context, MyWidgetProvider.class);
remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm, getPendingSelfIntent(context, MyOnClick1));
remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm, getPendingSelfIntent(context, MyOnClick2));
remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm, getPendingSelfIntent(context, MyOnClick3));
remoteViews.setTextViewText(R.id.widget_textview_gpscoords, "gps cords");
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
回答by zaPlayer
just call the super in your onReceive method
只需在您的 onReceive 方法中调用 super
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);//add this line
if (MyOnClick1.equals(intent.getAction())) {
// your onClick action is here
Toast.makeText(context, "Button1", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button1");
} else if (MyOnClick2.equals(intent.getAction())) {
Toast.makeText(context, "Button2", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button2");
} else if (MyOnClick3.equals(intent.getAction())) {
Toast.makeText(context, "Button3", Toast.LENGTH_SHORT).show();
Log.w("Widget", "Clicked button3");
}
}
回答by Faxriddin Abdullayev
here is the example:
这是示例:
public class SimpleWidgetProvider extends AppWidgetProvider {
private static final String MY_BUTTTON_START = "myButtonStart";
RemoteViews remoteViews;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int count = appWidgetIds.length;
for (int i = 0; i < count; i++) {
int widgetId = appWidgetIds[i];
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
remoteViews.setTextViewText(R.id.textView, number);
Intent intent = new Intent(context, SimpleWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.actionButton,
getPendingSelfIntent(context, MY_BUTTTON_START));
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (MY_BUTTTON_START.equals(intent.getAction())){
Toast.makeText(context, "Click", Toast.LENGTH_SHORT).show();
}
};
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
}