如何在小部件点击时启动网站?

4

我有一个基础的小部件,可以显示文本字段。我正在尝试弄清楚如何在用户单击小部件本身时启动网站URL。我似乎找不到任何相关代码。

5个回答

6

我们无法直接在小部件中使用 onClickListener 和视图一起使用。相反,我们应该使用 PendingIntent 对我们的 Intent 进行包装,并将 setOnClickPendingIntent 设置为视图。

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        // There maybe > 1 instance of our widget
        for (int i : appWidgetIds) {
        startBrowsing(context, appWidgetManager, i);
        }
    }

// Processing click on widget
    private void startBrowsing(Context ctx,
            AppWidgetManager appWidgetManager, int widgetID) {
        RemoteViews widgetView = new RemoteViews(ctx.getPackageName(), R.layout.widget);
        Uri uri = Uri.parse("http://www.google.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        PendingIntent pIntent = PendingIntent.getActivity(ctx, widgetID, intent, 0);
           // viewID - our clickable view ID
        widgetView.setOnClickPendingIntent(R.id.viewID, pIntent);

        appWidgetManager.updateAppWidget(widgetID, widgetView);


    }

在metadata.xml文件中将更新周期设置为0,因为我们需要手动更新它。

android:updatePeriodMillis="0"

不要忘记

<uses-permission android:name="android.permission.INTERNET"/>

4
首先,设置一个操作标识符。
private final String WIDGET_CLICK = "WidgetClick";

接下来,在初始化小部件时,为您的小部件的根视图注册一个PendingIntent。将"YourAppWidgetProvider"替换为重写了AppWidgetProvider的小部件类。

Intent intent = new Intent(context, YourAppWidgetProvider.class);
intent.setAction(WIDGET_CLICK);
views.setOnClickPendingIntent(R.id.widget_layout, PendingIntent.getBroadcast(context, 0, intent, 0));

最后,重写onReceive并使用其提供的上下文来启动您的网站。将"urlString"替换为您的网站地址,并不要忘记在地址中包含http://。

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    if (intent.getAction() != null && intent.getAction().equals(WIDGET_CLICK)) {
        try {
            Intent webIntent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(urlString));
            webIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(webIntent);
        } catch (RuntimeException e) {
            // The url is invalid, maybe missing http://
            e.printStackTrace();
        }
    }
}

0

基本上有两个选项:

  1. 类似链接 - 创建链接化的TextView,因此通过点击这些链接,您将进入(在Web中)
  2. 通过onClickListener - 在先前的答案中描述。

我更喜欢第一种方法:

TextView tv=(TextView ) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml("<a href='stackoverflow.com'>Go StackOverFlow!</a>"));

0

我猜你说“小部件”是因为之前的答案对你没用。我也有同样的问题——你可能需要通过RemoteViews API设置一个挂起的意图,就像这里所做的那样(https://dev59.com/M3I95IYBdhLWcg3w8iz1),只不过你会传递TextView ID而不是Button ID……我想。

你不需要花哨的意图操作……只需将PendingIntent调用中使用的Intent替换为@CommonsWare在这个问题的答案中提供的Intent即可。


-1

使用TextView.setOnClickListener(this)将该TextView设置为可点击,然后让您的活动实现OnClickListener接口并定义public void onClick(View v)方法。

onClick(View v)方法中,执行以下操作:

public void onClick(View v){
 startActivity(new Intent(Intent.ACTION_VIEW, url));
}

这将在设备浏览器中打开 url

您还可以拥有另一个使用 WebView 显示网站的活动。

希望对您有所帮助。


Android小部件是围绕AppWidgetProvider构建的,而不是Activity。AppWidgetProvider没有startActivity(Intent intent)这样的方法。 - Finnboy11
我在这里建议的是让小部件可点击,然后在处理点击事件的地方使用 startActivity() 来触发一个意图以打开 URL。 - Aman Alam
请看一下我添加的答案。它与你的答案有很大不同。如果这是一个普通的Activity,你的答案会很棒,但是小部件与之相比行为不同。很抱歉,我必须在这个问题上保持-1票,但是不要让这影响你的心情。 - Finnboy11
我不介意被踩,但我认为你的解决方案对于某些简单的问题来说过于复杂,没有什么好的理由。 - Aman Alam
你是否曾经使用扩展了AppWidgetProvider的小部件类来测试你的代码(通常是这样的)?AppWidgetProvider没有onClick或startActivity方法,它的视图只能通过RemoteViews包访问,而该包不支持setOnClickListener方法。 - Finnboy11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接