Android 如何在widget点击上启动网站?

Android 如何在widget点击上启动网站?,android,url,widget,onclick,Android,Url,Widget,Onclick,我有一个显示文本字段的基本小部件。我试图弄清楚当用户点击小部件时如何启动网站url。我似乎找不到关于这个问题的任何代码。基本上有两种选择: 链接相似-创建链接化的文本视图,通过点击这些链接,你将在那里(在网络中) 通过onClickListener-如前一个答案所述 我更喜欢第一种方法: TextView tv=(TextView ) findViewById(R.id.myTextView); tv.setText(Html.fromHtml("<a href='stackoverflo

我有一个显示文本字段的基本小部件。我试图弄清楚当用户点击小部件时如何启动网站url。我似乎找不到关于这个问题的任何代码。

基本上有两种选择:

  • 链接相似-创建链接化的文本视图,通过点击这些链接,你将在那里(在网络中)
  • 通过onClickListener-如前一个答案所述
  • 我更喜欢第一种方法:

    TextView tv=(TextView ) findViewById(R.id.myTextView);
    tv.setText(Html.fromHtml("<a href='stackoverflow.com'>Go StackOverFlow!</a>"));
    
    TextView-tv=(TextView)findviewbyd(R.id.myTextView);
    tv.setText(Html.fromHtml(“”);
    
    将该文本视图设置为可使用
    TextView.setOnClickListener(this)
    单击,然后让您的活动实现
    OnClickListener
    界面并定义
    public void onClick(View v)
    方法

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

    public void onClick(View v){
     startActivity(new Intent(Intent.ACTION_VIEW, url));
    }
    
    这将在设备浏览器中打开
    url

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


    我希望这会有帮助。

    我猜,因为你说的是“widget”,所以前面的答案对你不适用。我也有同样的想法——您可能需要通过RemoteViews API设置一个挂起的意图,就像这里所做的那样(http://stackoverflow.com/questions/2082998/how-to-implement-a-button-on-an-android-widget)除了您将传入textview ID而不是按钮ID。。。我想


    你不应该需要花式动作的东西。。。只需将他们在PendingEvent调用中使用的意图替换为@Commonware对此问题的回答中的意图。

    我们不能将
    onClickListener
    直接用于widget中的视图。相反,我们应该用
    pendingent
    setonclickpendingent
    来包装我们的
    意图

    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"/>
    

    首先,设置操作标识符

    private final String WIDGET_CLICK = "WidgetClick";
    
    然后,在初始化小部件时,为小部件的根视图注册一个PendingEvent。用覆盖AppWidgetProvider的小部件类替换“YourAppWidgetProvider”

    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();
            }
        }
    }
    

    Android小部件是围绕AppWidgetProvider而不是活动构建的。AppWidgetProvider没有startActivity(Intent Intent)这样的方法。我在这里建议的是让小部件可以单击,然后在处理单击的位置使用
    startActivity()
    来激发打开URL的意图。请看一下我添加的答案。它和你的有很大不同。如果这是一个正常的活动,您的答案会非常好,但与此相比,小部件的行为有所不同。我很抱歉,但我必须保留对这一点的-1票,但不要让这破坏了你的一天。我不介意否决票。但是我觉得你的解决方案对于一些简单的东西来说是一种更为艰难的方法,没有什么好的理由。你有没有用扩展AppWidgetProvider的小部件类测试过你的代码(就像他们通常做的那样)?AppWidgetProvider没有onClick或startActivity方法,只能使用不支持setOnClickListener的RemoteViews捆绑包访问其视图。