首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >android中的可点击小部件

android中的可点击小部件
EN

Stack Overflow用户
提问于 2010-05-01 09:58:31
回答 1查看 47.8K关注 0票数 63

开发人员文档似乎在这里让我失望了。我可以不假思索地创建一个静态的小部件,我甚至可以创建一个像模拟时钟小部件一样的小部件,它会自动更新,然而,我终生都想不出如何创建一个在用户点击它时做出反应的小部件。以下是开发人员文档提供的最佳代码示例,说明了小部件活动应该包含的内容(唯一的其他提示是API演示,它只创建一个静态小部件):

代码语言:javascript
复制
public class ExampleAppWidgetProvider extends AppWidgetProvider {
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            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);

            // Tell the AppWidgetManager to perform an update on the current App Widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

来自:The Android Developer Documentation's Widget Page

因此,它看起来像是在单击小部件时调用挂起的intent,这是基于intent的(我不太确定intent和挂起的intent之间的区别是什么),intent是用于ExampleActivity类的。因此,我将我的示例activity类创建为一个简单的activity,它在创建时将创建一个mediaplayer对象,并启动它(它永远不会释放该对象,所以它最终会崩溃,这是它的代码:

代码语言:javascript
复制
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    mp.start();
}

但是,当我将小部件添加到主屏幕并单击它时,没有播放任何内容,实际上,当我将更新计时器设置为几百毫秒(在appwidget提供者xml文件中)时,没有播放任何内容。此外,我设置了断点,发现它不仅永远不会到达活动,而且我设置的任何断点都不会被触发。(我仍然不知道为什么会这样),但是,logcat似乎表明activity类文件正在运行。

那么,我可以做些什么来让appwidget响应点击呢?因为onClickPendingIntent()方法是我发现的最接近onClick类型的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-01 11:01:55

首先,添加一个带有常量的静态变量。

代码语言:javascript
复制
public static String YOUR_AWESOME_ACTION = "YourAwesomeAction";

然后,您需要在将intent添加到挂起的intent之前将操作添加到intent:

代码语言:javascript
复制
Intent intent = new Intent(context, widget.class);
intent.setAction(YOUR_AWESOME_ACTION);

(其中widget.class是您的AppWidgetProvider的类,即当前类)

然后,需要使用getBroadcast创建一个PendingIntent

代码语言:javascript
复制
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

在小部件中设置可单击视图的onClickPendingIntent

代码语言:javascript
复制
remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent);

接下来,覆盖同一个类中的onReceive方法:

代码语言:javascript
复制
@Override
public void onReceive(Context context, Intent intent) {
 super.onReceive(context, intent);

然后通过在onReceive方法中查询为您的操作返回的意图来响应您的按钮按下:

代码语言:javascript
复制
if (intent.getAction().equals(YOUR_AWESOME_ACTION)) {
   //do some really cool stuff here
}

这应该就行了!

票数 129
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2748590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档