Я знаю, что я на 3 года опоздал на этот вопрос, но мне захотелось вздрогнуть.
Хотя решение Gumbo отлично работает, оно не обрабатывает несколько случаев где исключение не возникает для JSON.parse({something that isn't JSON})
Я также предпочитаю возвращать разобранный JSON одновременно, поэтому вызывающему коду не нужно вызывать JSON.parse(jsonString)
второй раз.
Это, похоже, хорошо работает для моих нужд:
function tryParseJSON (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
Посмотрите здесь и прокрутите до подзаголовка. Добавление поведения к отдельным элементам.
Вам нужно убедиться, что вы вызываете оба setPendingIntentTemplate()
из вашего AppWidgetProvider
и setOnClickFillInIntent()
из вашей реализации RemoteViewsService.RemoteViewsFactory
.
Например:
public class Widget extends AppWidgetProvider {
// ...
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for(int i = 0; i < appWidgetIds.length; i++){
RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent startActivityIntent = new Intent(context, myActivity.class);
PendingIntent startActivityPendingIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setPendingIntentTemplate(R.id.list_view, startActivityPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], widget);
// ...
}
}
public class WidgetAdapter implements RemoteViewsService.RemoteViewsFactory {
// ...
@Override
public RemoteViews getViewAt(int position) {
RemoteViews widgetRow = new RemoteViews(context.getPackageName(), R.layout.widget_row);
Intent fillInIntent = new Intent();
fillInIntent.putExtra(Widget.EXTRA_LIST_VIEW_ROW_NUMBER, position);
widgetRow.setOnClickFillInIntent(R.id.list_view_row, fillInIntent);
// ...
return row;
}
}
В примере StackWidget есть более убедительный пример, который находится в SDK , хотя мне было трудно найти (см. здесь для направлений). Он создает намерение показывать сообщение Toast, но использует тот же код.
Чтобы запустить любое действие, вы создаете намерение, а затем вызываете startActivity по этому намерению. Проверьте намерение и startActivity, и я уверен, что вы сможете сделать это сами.