Android部件的onclick监听几个按钮 [英] Android widget onclick listener for several buttons

查看:247
本文介绍了Android部件的onclick监听几个按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个小部件为我的应用程序,

这是我的阅读在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);
    }
};
}
 

我的Andr​​oid清单:

 <接收器
        机器人:名称=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);
}
 

设置这个标签的on​​Click你的看法如下:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆