单击应用小部件(远程视图)中的列表视图项,而不是启动活动

时间:2016-04-10 11:50:28

标签: android android-intent android-widget android-pendingintent remoteview

我正在尝试创建我的第一个应用小部件,我希望能够在点击某个项目时启动某个活动,但它无效。 这是我在onUpdate()中的代码:

Intent toastIntent = new Intent(context, TareaModificar.class);
toastIntent.putExtra("id", id);
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setPendingIntentTemplate(R.id.widget_tareas_listview, toastPendingIntent);

和我的getViewAt()代码:

Bundle extras = new Bundle();
    extras.putInt(WidgetTareas.id, cursor.getInt(0));
    Intent fillInIntent = new Intent();
    fillInIntent.putExtras(extras);
    remoteView.setOnClickFillInIntent(R.id.widget_tareas, fillInIntent);

id是小部件提供程序中的全局字符串变量。

编辑我提供了所有代码,也许通过这种方式提供帮助更容易:

AppWidgetProvider代码:

public class WidgetTareas extends AppWidgetProvider {
private String TAG = getClass().getSimpleName();
private DbAdapter dbAdapter;
public static final String id = "1";

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int i = 0; i < appWidgetIds.length; ++i) {
        Log.d(TAG,"Se actualiza el widget: " +i);
        RemoteViews remoteViews = updateWidgetListView(context,
                appWidgetIds[i]);
        appWidgetManager.updateAppWidget(appWidgetIds[i],
                remoteViews);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

private RemoteViews updateWidgetListView(Context context,
                                         int appWidgetId) {
    dbAdapter = new DbAdapter(context);
    dbAdapter.actualizaQueda(0);
    //which layout to show on widget
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_tareas);

    //RemoteViews Service needed to provide adapter for ListView
    Intent svcIntent = new Intent(context, WidgetTareasService.class);
    //passing app widget id to that RemoteViews Service
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    //setting a unique Uri to the intent
    //don't know its purpose to me right now
    svcIntent.setData(Uri.parse(
            svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
    //setting adapter to listview of the widget
    remoteViews.setRemoteAdapter(appWidgetId, R.id.widget_tareas_listview,
            svcIntent);

    Intent toastIntent = new Intent(context, TareaModificar.class);
    toastIntent.putExtra("id", id);
    toastIntent.setAction("ACTION_SHOW_TOAST");
    PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setPendingIntentTemplate(R.id.widget_tareas_listview, toastPendingIntent);
    return remoteViews;
}

@Override
public void onReceive(@NonNull Context context, @NonNull Intent intent) {
    super.onReceive(context, intent);
    Toast.makeText(context, "Intent received", Toast.LENGTH_SHORT).show();
    switch (intent.getAction()) {
        case "ACTION_SHOW_TOAST":
            //change your activity name
            int id = intent.getIntExtra("id", -1);
            context.startActivity(new Intent(context,
                    TareaModificar.class)
                    .setFlags(
                            Intent.FLAG_ACTIVITY_NEW_TASK));
            break;
    }
}

}

RemoteViewsFactory代码:

    @Override
public RemoteViews getViewAt(int position) {
    if (position == 0)
        cursor = dbAdapter.getTareasOrdenadoHacer(0);

    RemoteViews remoteView = new RemoteViews(
            context.getPackageName(), R.layout.a);
    Log.d(TAG,"Se carga la factoría");
    cursor.moveToPosition(position);
    String a = cursor.getString(cursor.getColumnIndex(dbAdapter.COL_A));
    remoteView.setTextViewText(R.id.tarea_widget_aa, dbAdapter.getAA(a));
    remoteView.setTextViewText(R.id.tarea_widget_tt, cursor.getString(cursor.getColumnIndex(dbAdapter.COL_T)));
    String queda = context.getString(R.string.en) +" "+ cursor.getString(cursor.getColumnIndex(dbAdapter.COL_Q)) +" "+context.getString(R.string.dias);
    remoteView.setTextViewText(R.id.tarea_widget_q, queda);

    remoteView.setTextViewText(R.id.tarea_widget_pos, position);


    // Next, we set a fill-intent which will be used to fill-in the pending intent template
    // which is set on the collection view in StackWidgetProvider.
    Bundle extras = new Bundle();
    extras.putInt(WidgetTareas.id, cursor.getInt(0));
    Intent fillInIntent = new Intent();
    fillInIntent.putExtras(extras);
    remoteView.setOnClickFillInIntent(R.id.widget_tareas, fillInIntent);
    return remoteView;
}

小部件布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/widget_tareas"
android:background="@color/common_action_bar_splitter">
<TextView
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/black"
    android:textSize="18sp"
    android:background="#E6E6E6"
    android:text="@string/tareas"/>
<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/widget_tareas_listview"/>

布局代码:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:id="@+id/widget_tareas_item">
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="@color/black"
        android:text="99"
        android:gravity="center_horizontal"
        android:id="@+id/tarea_widget_q"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="@color/black"
        android:gravity="center_horizontal"
        android:text="pos"
        android:id="@+id/tarea_widget_pos"/>
</LinearLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:textColor="@color/black"
        android:id="@+id/tarea_widget_aa" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:text="sad"
        android:id="@+id/tarea_widget_tt" />
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您必须在窗口小部件提供程序的onReceive中管理操作。

在getViewAt方法中准备你的意图:

Intent toastIntent = new Intent(context, TareaModificar.class);
toastIntent.putExtra("id", id);
toastIntent.setAction("ACTION_SHOW_TOAST");
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setPendingIntentTemplate(R.id.widget_tareas_listview, toastPendingIntent);

在你的onReceive中,管理它:

  @Override
    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
        super.onReceive(context, intent);
        switch (intent.getAction()) {

            case "ACTION_SHOW_TOAST":
                  //change your activity name
                  int id = intent.getIntExtra("id", -1);
                   context.startActivity(new Intent(context,
                    TareaModificar.class)
                    .setFlags(
                    Intent.FLAG_ACTIVITY_NEW_TASK)

                break;
        }
   }