2014-02-20 104 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

編輯:

使用context.startActivity(new Intent(context, ActivityClassName.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

+0

我tryed,但我有錯誤,這是一個我logcat的錯誤:了java.lang.RuntimeException:無法啓動MyWidgetProvider:從活動之外呼喚新活動 – user3293990

+0

編輯我的答案與解決方法,這可能並不總是最適合的,但作品 – Sam

+0

完成工作謝謝 – user3293990

0
+0

是的我知道我用意圖調用Opdate方法MyRemoteViewsService類,但現在我想打電話在小部件點擊活動例如Mainactivity.java類 – user3293990

+0

我沒有看到在你的代碼中,你設置點擊pendin g意圖在您的遠程視圖上。每次用戶點擊您的小部件時,這個掛起的意圖都會被觸發。 – ranjk89

+0

你有看過這個 - http://developer.android.com/reference/android/widget/StackView.html#onTouchEvent(android.view.MotionEvent) – ranjk89

0

按下按鈕:

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