Android部件的onclick监听几个按钮 [英] Android widget onclick listener for several buttons
问题描述
我想创建一个小部件为我的应用程序,
这是我的阅读在Android开发者网站你的onclick听众都需要有一个意图是什么?
但如果我突出部分希望我的按钮来更新窗口小部件自身的数据,我并不想开始一个新的活动?
下面是Android的演示code:
意向意图=新的意图(背景下,ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(上下文,0,意图,0);
//获取该应用程序窗口小部件的布局,并附加一点击监听器
//到按钮
RemoteViews意见=新RemoteViews(context.getPackageName(),R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button,pendingIntent);
我希望有一个按钮,当我点击发出HTTP网页呼叫,然后将结果显示在窗口小部件?我该如何去这样做。如果我必须使用意图?此外,我需要能够在这里单击该按钮来区分。
为什么部件使用意图,而不是正常的onclick监听器哪里调用类的活动功能?
{编辑}
我的部件供应商
ublic类MyWidgetProvider扩展AppWidgetProvider {
私有静态最后弦乐MyOnClick1 =myOnClickTag1;
私有静态最后弦乐MyOnClick2 =myOnClickTag2;
私有静态最后弦乐MyOnClick3 =myOnClickTag3;
@覆盖
公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds){
//获取所有ID
组件名thisWidget =新的组件名(背景下,MyWidgetProvider.class);
INT [] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
对于(INT为widgetid:allWidgetIds){
RemoteViews remoteViews =新RemoteViews(context.getPackageName(),R.layout.widget_layout);
remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm,getPendingSelfIntent(上下文,MyOnClick1));
remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm,getPendingSelfIntent(上下文,MyOnClick2));
remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm,getPendingSelfIntent(上下文,MyOnClick3));
remoteViews.setTextViewText(R.id.widget_textview_gpscoords,GPS线);
appWidgetManager.updateAppWidget(为widgetid,remoteViews);
}
}
保护PendingIntent getPendingSelfIntent(上下文的背景下,串动){
意向意图=新的意图(背景下,的getClass());
intent.setAction(动作);
返回PendingIntent.getBroadcast(上下文,0,意图,0);
}
@覆盖
公共无效的onReceive(上下文的背景下,意图意图){
如果(MyOnClick1.equals(intent.getAction())){
//你的onClick动作是在这里
Toast.makeText(上下文中,Button1的,Toast.LENGTH_SHORT).show();
Log.w(小部件,已点击按钮1);
}否则,如果(MyOnClick2.equals(intent.getAction())){
Toast.makeText(上下文中,将Button2,Toast.LENGTH_SHORT).show();
Log.w(小部件,已点击按钮2);
}否则,如果(MyOnClick3.equals(intent.getAction())){
Toast.makeText(上下文中,将Button3,Toast.LENGTH_SHORT).show();
Log.w(小部件,已点击按钮3);
}
};
}
我的Android清单:
<接收器
机器人:名称=widget.MyWidgetProvider
机器人:图标=@可绘制/ FSK
机器人:标签=FSK小工具>
<意向滤光器>
<作用机器人:名称=android.appwidget.action.APPWIDGET_UPDATE/>
&所述; /意图滤光器>
&所述;元数据
机器人:名称=android.appwidget.provider
机器人:资源=@ XML / example_appwidget_info/>
< /接收器>
有可能使一个onclick事件在窗口小部件视图。只要你想,你可以创建任意多的onClick事件。
在你的Widget类的顶部,创建一个静态变量,这将是你的onClick名称标签:
私有静态最后弦乐MyOnClick =myOnClickTag;
getPendingSelfIntent:
保护PendingIntent getPendingSelfIntent(上下文的背景下,串动){
意向意图=新的意图(背景下,的getClass());
intent.setAction(动作);
返回PendingIntent.getBroadcast(上下文,0,意图,0);
}
设置这个标签的onClick你的看法如下:
remoteViews.setOnClickPendingIntent(R.id.button,
getPendingSelfIntent(上下文,MyOnClick));
在你的Widget类创建的onReceive方法,并将此onClick事件里面:
公共无效的onReceive(上下文的背景下,意图意图){
如果(MyOnClick.equals(intent.getAction())){
//你的onClick动作是在这里
}
};
当您设置的标签的观点是pressed,会的onReceive捕获,并会做的动作一样的作为我们的日常生活,标准onclick事件。
编辑:根据您的回答,您可以用下面的行替换您的onupdate内容,然后再试一次:
RemoteViews remoteViews =新RemoteViews(context.getPackageName(),R.layout.widget_det);
thisWidget =新的组件名(背景下,MyWidgetProvider.class);
remoteViews.setOnClickPendingIntent(R.id.widget_button_stayarm,getPendingSelfIntent(上下文,MyOnClick1));
remoteViews.setOnClickPendingIntent(R.id.widget_button_awayarm,getPendingSelfIntent(上下文,MyOnClick2));
remoteViews.setOnClickPendingIntent(R.id.widget_button_dissarm,getPendingSelfIntent(上下文,MyOnClick3));
remoteViews.setTextViewText(R.id.widget_textview_gpscoords,GPS线);
appWidgetManager.updateAppWidget(thisWidget,remoteViews);
I am trying to create a widget for my application,
From my reading on android developer site your onclick listeners all need to have an Intent?
But what if I jut want my button to update data in the widget its self, I don't want to start a new activity?
Here is android demo code:
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.
Why do widgets use intents and not the normal onclick listener where it calls a function like activities?
{EDIT}
My widget provider
ublic 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:
<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>
It is possible to make an onClick event for Views in Widgets. You can create as many onClick events as you want.
On top of your Widget class, create a static variable, which will be your onClick name tag:
private static final String MyOnClick = "myOnClickTag";
getPendingSelfIntent:
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:
remoteViews.setOnClickPendingIntent(R.id.button,
getPendingSelfIntent(context, MyOnClick));
create an onReceive method in your Widget class and set this onClick event inside it:
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.
Edit: According to your answer, can you replace your onUpdate content with following lines and try again:
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);
这篇关于Android部件的onclick监听几个按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!