应用程序小部件android中的listview

时间:2013-12-09 09:07:29

标签: android listview android-appwidget

朋友enter link description here

此链接为我的应用创建列表视图小部件,但在这里我想在列表视图下方添加一个按钮,点击该按钮将打开我的应用, 使用下面的代码来实现这一点,因为它在我的其他应用程序上工作,但不是这个例子,如何做到这一点。

class widgetprovider

public class WidgetProvider extends AppWidgetProvider {

    // String to be sent on Broadcast as soon as Data is Fetched
    // should be included on WidgetProvider manifest intent action
    // to be recognized by this WidgetProvider to receive broadcast
    public static final String DATA_FETCHED = "com.wordpress.laaptu.DATA_FETCHED";


    /*
     * this method is called every 30 mins as specified on widgetinfo.xml this
     * method is also called on every phone reboot from this method nothing is
     * updated right now but instead RetmoteFetchService class is called this
     * service will fetch data,and send broadcast to WidgetProvider this
     * broadcast will be received by WidgetProvider onReceive which in turn
     * updates the widget
     */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        // which layout to show on widget
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);
        Intent informationIntent = new Intent(context,info.class);
        PendingIntent infoPendingIntent = PendingIntent.getActivity(context,0, informationIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.btnSeeMore,infoPendingIntent);

        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            Intent serviceIntent = new Intent(context, RemoteFetchService.class);
            serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    appWidgetIds[i]);
            context.startService(serviceIntent);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

manifest添加了一个活动

<activity android:name=".info" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.INFO" />
            </intent-filter>
        </activity>

点击它时应该打开我的应用程序,该怎么做请帮助,谢谢

最终我解决了我想要的问题, 刚刚写了一个按钮点击代码onReceive&amp;它起作用了

@Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (intent.getAction().equals(DATA_FETCHED)) {
            Log.i("inside action", "DATA_FETCHED");
            int appWidgetId = intent.getIntExtra(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
            AppWidgetManager appWidgetManager = AppWidgetManager
                    .getInstance(context);
            RemoteViews remoteViews = updateWidgetListView(context, appWidgetId);

              Intent informationIntent = new Intent(context,MainActivity.class);
              PendingIntent infoPendingIntent = PendingIntent.getActivity(context,0, informationIntent, 0);
              remoteViews.setOnClickPendingIntent(R.id.txtSeeMore,infoPendingIntent);

            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }   

}

1 个答案:

答案 0 :(得分:1)

您需要通过覆盖提供商内部的onReceive方法来定义如何处理您设置的PendingIntent:

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    if (intent.getAction().equals(ACTION_NAME)) {
        // Open your activity here.
    }
}

如果ListView中的每个项目都需要不同的额外内容来帮助onReceive创建正确的Intent,则可以在getViewAt中为ListView的每个项目使用FillInIntent:

// Set the onClickFillInIntent
final Intent fillInIntent = new Intent();
final Bundle extras = new Bundle();
extras.putInt(YourWidgetProvider.ACTION_EXTRA_ITEM, event.getId()); // retrieve this in onReceive with intent.getIntExtra(ACTION_EXTRA_ITEM, -1)
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.listview_main_layout, fillInIntent);
return rv;

另外,不要忘记将您的Provider和RemoteViewsService添加到您的Manifest:

<receiver 
    android:name="com.example.YourWidgetProvider"
    android:label="@string/widget_name">
     <intent-filter>
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
     </intent-filter>
     <meta-data
         android:name="android.appwidget.provider"
         android:resource="@xml/provider_definition_in_xml" />
</receiver>

<service android:name="com.example.YourRemoteViewsService"
     android:permission="android.permission.BIND_REMOTEVIEWS"
     android:exported="false" />

编辑:

要处理主窗口小部件中按钮的点击(而不是在集合视图中),它会更容易:

rv.setOnClickPendingIntent(R.id.button_id, PendingIntent.getBroadcast(context, 0,
                        new Intent(context, YourWidgetProvider.class)
                        .setAction(ACTION_NAME),
                        PendingIntent.FLAG_UPDATE_CURRENT));

ACTION_NAME需要与您用于集合视图点击的名称不同,当然,因为它需要生成不同的Intent。

我希望这有帮助!