我有一个基础的小部件,可以显示文本字段。我正在尝试弄清楚如何在用户单击小部件本身时启动网站URL。我似乎找不到任何相关代码。
我们无法直接在小部件中使用 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"/>
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();
}
}
}
基本上有两个选项:
我更喜欢第一种方法:
TextView tv=(TextView ) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml("<a href='stackoverflow.com'>Go StackOverFlow!</a>"));
我猜你说“小部件”是因为之前的答案对你没用。我也有同样的问题——你可能需要通过RemoteViews API设置一个挂起的意图,就像这里所做的那样(https://dev59.com/M3I95IYBdhLWcg3w8iz1),只不过你会传递TextView ID而不是Button ID……我想。
你不需要花哨的意图操作……只需将PendingIntent调用中使用的Intent替换为@CommonsWare在这个问题的答案中提供的Intent即可。
使用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 显示网站的活动。
希望对您有所帮助。
startActivity()
来触发一个意图以打开 URL。 - Aman Alam