2014-02-20 3 views
-1

Я создал appwidget (виджет StackView), и я могу показывать изображения и текст в виде виджета StackView. Теперь я хочу, чтобы я щелкнул виджет StackView, чтобы начать новую активность, например MainActivity.java. Я написал код, который может отображать сообщение тоста в позиции виджетов, но я не знаю, как начать новую активность вместо сообщения тоста. Это является мой кодAndroid appwidget начинает новую активность

public class MyWidgetProvider extends AppWidgetProvider { 
public static final String TOAST_ACTION = "com.example.android.stackwidget.TOAST_ACTION"; 
public static final String EXTRA_ITEM = "com.example.android.stackwidget.EXTRA_ITEM"; 
private RemoteViews views; 
private Intent intent; 

@Override 
public void onDeleted(Context context, int[] appWidgetIds) { 
    super.onDeleted(context, appWidgetIds); 
} 

@Override 
public void onDisabled(Context context) { 
    super.onDisabled(context); 
} 

@Override 
public void onEnabled(Context context) { 
    super.onEnabled(context); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
    if (intent.getAction().equals(TOAST_ACTION)) { 
     int appWidgetId = intent.getIntExtra(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
     int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0); 
     Toast.makeText(context, "Touched view " + viewIndex, 
       Toast.LENGTH_SHORT).show(); 

     // mgr.updateAppWidget(appWidgetId, views); 
    } 
    super.onReceive(context, intent); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    final int N = appWidgetIds.length; 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     intent = new Intent(context, MyRemoteViewsService.class); 

     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 

     views = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     views.setRemoteAdapter(appWidgetId, R.id.stackWidgetView, intent); 

     views.setEmptyView(R.id.stackWidgetView, R.id.stackWidgetEmptyView); 

     Intent templateIntent = new Intent(context, 
       BriGeWidgetProvider.class); 
     templateIntent.setAction(BriGeWidgetProvider.TOAST_ACTION); 
     templateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       appWidgetId); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
     PendingIntent templatePendingIntent = PendingIntent.getBroadcast(
       context, 0, templateIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     views.setPendingIntentTemplate(R.id.stackWidgetView, 
       templatePendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

}

public class MyRemoteViewsService extends RemoteViewsService { 
@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 

    return new BriGeRemoteViewsFactory(this.getApplicationContext(), intent); 
} 

class BriGeRemoteViewsFactory implements RemoteViewsFactory { 

    private ArrayList<ItemI> itemList; 
    private Context context; 
    private int appWidgetId; 

    public BriGeRemoteViewsFactory(Context context, Intent intent) { 
     this.context = context; 
     this.appWidgetId = intent.getIntExtra(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
    } 

    @Override 
    public void onCreate() { 
     itemList = getData(); 
    } 

    @Override 
    public void onDataSetChanged() { 
     itemList = getData(); 
    } 

    @Override 
    public void onDestroy() { 
     itemList.clear(); 
    } 

    @Override 
    public int getCount() { 
     if (itemList != null) 
      return itemList.size(); 
     else 
      return 0; 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     ItemI item = itemList.get(position); 

     RemoteViews rv = new RemoteViews(context.getPackageName(), 
       R.layout.item_view); 

     rv.setTextViewText(R.id.title, item.getTitle()); 
     rv.setImageViewBitmap(R.id.img, getImageBitmap(item.getImage())); 
     // rv.setTextViewText(R.id.descr, item.getDescription()); 

     Bundle extras = new Bundle(); 
     extras.putInt(BriGeWidgetProvider.EXTRA_ITEM, position); 
     Intent fillIntent = new Intent(); 
     fillIntent.putExtras(extras); 

     rv.setOnClickFillInIntent(R.id.title, fillIntent); 
     rv.setOnClickFillInIntent(R.id.img, fillIntent); 
     // rv.setOnClickFillInIntent(R.id.descr, fillIntent); 

     return rv; 
    } 

    private Bitmap getImageBitmap(String url) { 
     Bitmap bm = null; 
     try { 
      URL aURL = new URL(url); 
      URLConnection conn = aURL.openConnection(); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      bm = BitmapFactory.decodeStream(bis); 
      bis.close(); 
      is.close(); 
     } catch (IOException e) { 
     } 
     return bm; 
    } 

    @Override 
    public RemoteViews getLoadingView() { 
     return null; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    private ArrayList<ItemI> getData() { 
     JsonParser jp = new JsonParser(context); 
     return jp.getDataAsList(); 
    } 
} 

}

ответ

0

EDIT:

Использование context.startActivity(new Intent(context, ActivityClassName.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

+0

я судимый, но у меня есть ошибка, это моя ошибка LogCat: java.lang.RuntimeException: Не удается запустить MyWidgetProvider: Calling новой активности из-за пределы в деятельности – user3293990

+0

отредактировал мой ответ обходным путем, который может быть не всегда наилучшим образом подходит, но работает – Sam

+0

done working thank you – user3293990

0

Вы должны установить на щелчок в ожидании намерения к удаленному Посмотреть.

См this- http://developer.android.com/reference/android/widget/RemoteViews.html#setOnClickPendingIntent

И this- https://stackoverflow.com/a/18012520/713778

+0

yes Я знаю, что я использовал Intent для вызова класса MyRemoteViewsService в методе Opdate, но теперь я хочу позвонить активность в виджетах нажмите, например, Mainactivity.java класс – user3293990

+0

Я не вижу в вашем коде, где вы нажимаете pendin g на вашем удаленном просмотре. Это ожидающее намерения будет запущено каждый раз, когда пользователь нажимает на ваш виджет. – ranjk89

+0

У вас есть это - http://developer.android.com/reference/android/widget/StackView.html#onTouchEvent(android.view.MotionEvent) – ranjk89

0

На Button Press:

Intent newIntent = new Intent("PACKAGENAME.CLASSNAME"); 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(newIntent); 

Или:

newIntent.setComponent(new ComponentName("PACKAGENAME", "PACKAGENAME.CLASSNAME")); 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(newIntent); 
1

Используйте PendinIndent, чтобы перейти от MyWidgetProvider к MyRemoteViewsService.class ,

ли это в «OnUpdate» ме-

Intent intent = new Intent(context,MyRemoteViewsService.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
RemoteViews remoteViews = remoteViews.setOnClickPendingIntent(R.id.button , pendingIntent); 
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
Смежные вопросы