如何处理按钮单击控件 [英] How to Handle Button Click on Widget

查看:110
本文介绍了如何处理按钮单击控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为了自动更新已经一个构件上我的应用程序和服务

手工小部件有一个的ImageButton 其中触发器更新内容。但我无法处理Click事件。

下面是我的 AppWidgetProvider

 公共类进myWidget扩展AppWidgetProvider {

    公共静态字符串ACTION_WIDGET_RECEIVER =ActionReceiverWidget;

    @覆盖
    公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds){
        super.onUpdate(背景下,appWidgetManager,appWidgetIds);

        RemoteViews rmViews =新RemoteViews(context.getPackageName(),R.layout.widget_layout);

        意图激活=新的意图(背景下,MyWidget.class);
        active.setAction(ACTION_WIDGET_RECEIVER);
        active.putExtra(味精,消息按钮1);
        PendingIntent configPendingIntent = PendingIntent.getActivity(上下文,0,活性,0);

        rmViews.setOnClickPendingIntent(R.id.buttonus1,configPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds,rmViews);
    }

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        super.onReceive(背景下,意图);
            如果(intent.getAction()。等于(ACTION_WIDGET_RECEIVER)){
                Log.d(debug_tag,intent.getAction());
            }
    }
}
 

当我点击按钮,没有什么改变。它甚至不被记录。

的Manifest.xml声明:

 <接收器安卓名=机器人进myWidget。:标签=@字符串/ APP_NAME>
    <意向滤光器>
        <作用机器人:名称=android.appwidget.action.APPWIDGET_UPDATE/>
        <作用机器人:名称=com.app.example.MyWidget.ACTION_WIDGET_RECEIVER/>
        &所述; /意图滤光器>
    <元数据的android:NAME =android.appwidget.provider安卓资源=@ XML /小工具/>
< /接收器>
 

怎么了?

顺便说一句,如果我能处理一下,我应该怎么使用了手动更新?难道我把它传递给服务,哪些方式?

修改:更改 getActivity() getBroadcast()和处理点击好。但不能将此消息传递给服务。任何建议?

解决方案

 更新你的`AppWidgetProvider`:


公共类进myWidget扩展AppWidgetProvider {
        公共静态字符串ACTION_WIDGET_RECEIVER =ActionReceiverWidget;

        公共静态INT的appid [];
        公共静态RemoteViews rview;
        @覆盖
        公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,
                INT [] appWidgetIds){
            updateWidgetState(上下文,);
        }
        @覆盖
        公共无效的onReceive(上下文paramContext,意图paramIntent)
          {
             字符串str = paramIntent.getAction();
            如果(paramIntent.getAction()。等于(ACTION_WIDGET_RECEIVER)){
                updateWidgetState(paramContext,STR);
            }
            其他
            {
                    如果(android.appwidget.action.APPWIDGET_DELETED.equals(STR))
                      {
                        INT I = paramIntent.getExtras()调用getInt(appWidgetId,0);
                        如果(我== 0)
                        {

                        }
                        其他
                        {
                            INT [] arrayOfInt =新INT [1];
                            arrayOfInt [0] = I;
                            onDeleted(paramContext,arrayOfInt);
                        }
                      }
              super.onReceive(paramContext,paramIntent);
            }
          }
         静态无效updateWidgetState(上下文paramContext,字符串中的paramString)
          {
            RemoteViews localRemoteViews = buildUpdate(paramContext,中的paramString);
            组件名localComponentName =新的组件名(paramContext,MyWidget.class);
            AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName,localRemoteViews);
          }
         私有静态RemoteViews buildUpdate(上下文paramContext,字符串中的paramString)
          {
            // Toast.makeText(paramContext,buildUpdate()::+的paramString,Toast.LENGTH_SHORT).show();
            rview =新RemoteViews(paramContext.getPackageName(),R.layout.widget_layout);
            意图激活=新的意图(paramContext,MyWidget.class);
            active.setAction(ACTION_WIDGET_RECEIVER);
            active.putExtra(味精,消息按钮1);
            PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext,0,活性,0);
            rmViews.setOnClickPendingIntent(R.id.buttonus1,configPendingIntent);
            如果(parmString.equals(ACTION_WIDGET_RECEIVER))
            {
             //你的code进行更新,并且希望在按钮点击什么

            }
             返回rview;
          }
        @覆盖
        公共无效onEnabled(上下文的背景下){
            super.onEnabled(上下文);
           // Toast.makeText(上下文,onEnabled(),Toast.LENGTH_SHORT).show();
        }
        //调用的应用程序窗口小部件的一个实例是从主机中删除每次
        @覆盖
        公共无效onDeleted(上下文的背景下,INT [] appWidgetId){
            super.onDeleted(背景下,appWidgetId);
           // Toast.makeText(上下文,onDeleted(),Toast.LENGTH_SHORT).show();
        }
        //调用时应用小工具的最后一个实例是从应用程序的Widget主机中删除。
        @覆盖
        公共无效onDisabled(上下文的背景下){
            super.onDisabled(上下文);
           // Toast.makeText(上下文,onDisabled(),Toast.LENGTH_SHORT).show();
        }

    }
 

I've a widget on my app and Service in order to update automatically.

Widget has a ImageButton which triggers updating content manually. But I couldn't handle click event.

Here is my AppWidgetProvider:

public class MyWidget extends AppWidgetProvider {

    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        RemoteViews rmViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

        Intent active = new Intent(context, MyWidget.class);
        active.setAction(ACTION_WIDGET_RECEIVER);
        active.putExtra("msg", "Message for Button 1");
        PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, active, 0);

        rmViews.setOnClickPendingIntent(R.id.buttonus1, configPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, rmViews );
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
            if(intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
                Log.d(debug_tag, intent.getAction());
            }
    }
}

When I clicked the button nothing changed. It doesn't even logged.

Manifest.xml declaration:

<receiver android:name=".MyWidget" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="com.app.example.MyWidget.ACTION_WIDGET_RECEIVER"/>
        </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget"/>
</receiver>

What's wrong?

By the way, if I could handle the click, how should I use for updating manually? Do I pass it to service and which way?

Edit: Changed getActivity() with getBroadcast() and handled click well. But couldn't pass this message to Service. Any recommendations?

解决方案

Update your `AppWidgetProvider`:


public class MyWidget extends AppWidgetProvider {
        public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

        public static int appid[];
        public static RemoteViews rview;
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
                int[] appWidgetIds){
            updateWidgetState(context, ""); 
        }
        @Override
        public void onReceive(Context paramContext, Intent paramIntent)
          {
             String str = paramIntent.getAction();
            if (paramIntent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
                updateWidgetState(paramContext, str);   
            }
            else
            {
                    if ("android.appwidget.action.APPWIDGET_DELETED".equals(str))
                      {
                        int i = paramIntent.getExtras().getInt("appWidgetId", 0);
                        if (i == 0)
                        {

                        }
                        else
                        {
                            int[] arrayOfInt = new int[1];
                            arrayOfInt[0] = i;
                            onDeleted(paramContext, arrayOfInt);
                        }
                      }
              super.onReceive(paramContext, paramIntent);
            }
          }
         static void updateWidgetState(Context paramContext, String paramString)
          {
            RemoteViews localRemoteViews = buildUpdate(paramContext, paramString);
            ComponentName localComponentName = new ComponentName(paramContext, MyWidget.class);
            AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews);
          }
         private static RemoteViews buildUpdate(Context paramContext, String paramString)
          {
            // Toast.makeText(paramContext, "buildUpdate() ::"+paramString, Toast.LENGTH_SHORT).show();
            rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout);
            Intent active = new Intent(paramContext, MyWidget.class);
            active.setAction(ACTION_WIDGET_RECEIVER);
            active.putExtra("msg", "Message for Button 1");
            PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, active, 0);
            rmViews.setOnClickPendingIntent(R.id.buttonus1, configPendingIntent);
            if(parmString.equals(ACTION_WIDGET_RECEIVER))
            {
             //your code for update and what you want on button click

            }  
             return rview; 
          }
        @Override
        public void onEnabled(Context context){
            super.onEnabled(context);
           // Toast.makeText(context, "onEnabled()  ", Toast.LENGTH_SHORT).show();
        }
        // Called each time an instance of the App Widget is removed from the host
        @Override
        public void onDeleted(Context context, int [] appWidgetId){
            super.onDeleted(context, appWidgetId);
           // Toast.makeText(context, "onDeleted()  ", Toast.LENGTH_SHORT).show();
        }
        // Called when last instance of App Widget is deleted from the App Widget host.
        @Override
        public void onDisabled(Context context) {
            super.onDisabled(context);
           // Toast.makeText(context, "onDisabled()  ", Toast.LENGTH_SHORT).show();
        }

    }

这篇关于如何处理按钮单击控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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