首页 文章

如何在android小部件中使用PendingIntent?

提问于
浏览
0

我仍然是一个菜鸟,只能通过文档找不到解决方案 . 我有一个视图作为按钮的小部件,需要在单击视图时启动活动 .

<LinearLayout android:id="@+id/config"
    android:paddingLeft="14dp" android:paddingTop="3dp" android:paddingBottom="3dp" android:layout_margin="5dp"
    android:layout_alignParentRight="true"  android:background="@drawable/config_button"
    android:layout_width="wrap_content"  android:layout_height="wrap_content"
    android:clickable="true" android:gravity="center">

    <TextView
        android:text="..." android:rotation="90" android:textColor="#ffffffff" android:textSize="20sp"
        android:layout_width="wrap_content" android:clickable="true" android:gravity="center"
        android:layout_height="wrap_content" />

</LinearLayout>

我知道窗口小部件中的简单Intent,PendingIntent和setOnClickPendingIntent()不起作用,我必须以某种方式使用setPendingIntentTemplate()和setOnClickFillInIntent(),但我不知道如何 .

现在我有这个,这当然不起作用:

Intent intent = new Intent(context, ConfigActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.ror_appwidget);

        views.setPendingIntentTemplate(R.id.config, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);

我在这里缺少什么,我应该如何使用setOnClickFillInIntent方法?谢谢你的帮助 .

1 回答

  • 0

    首先,当您在窗口小部件上有ListView并希望处理ListView项目的点击时,您只能将setOnClickFillInIntent ALONG与setPendingIntentTemplate一起使用 . 但这不是你的情况 .

    我将举例说明如何在按钮上实现简单的点击事件并打开一个活动 .

    public class WidgetProvider extends AppWidgetProvider {
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    
            for (int widgetId : appWidgetIds) {
                RemoteViews views = buildRemoteViews(context);
    
                appWidgetManager.updateAppWidget(widgetId, views);
            }
        }
    
        private RemoteViews buildRemoteViews(Context context) {
            Intent homeIntent = new Intent(context, HomeActivity.class);
            homeIntent.setData(Uri.parse(homeIntent.toUri(Intent.URI_INTENT_SCHEME)));
            homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent homePendingIntent = PendingIntent.getActivity(context, 0, homeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            views.setOnClickPendingIntent(R.id.your_button, homePendingIntent);
    
            return views;
        }
    }
    

    这应该足以满足您的需求 .

    但非常重要的是在清单文件中声明您的小部件:

    <receiver
            android:name=".ui.widget.WidgetProvider"
            android:enabled="true"
            android:label="MyWidgetSample">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
                <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
            </intent-filter>
    
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_provider_info"/>
        </receiver>
    

    res / xml文件夹中的小部件信息提供程序文件(widget_provider_info.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/layout_widget"<!-- your built layout for the widget-->
        android:minHeight="110dp"
        android:minWidth="250dp"
        android:resizeMode="horizontal|vertical"
        android:updatePeriodMillis="86400000"
        android:widgetCategory="home_screen" />
    

    这有帮助吗?

    干杯,迈克

相关问题