【问题标题】:How to get the AppWidget id that I just clicked?如何获取我刚刚点击的 AppWidget id?
【发布时间】:2017-10-20 17:55:00
【问题描述】:

我需要在单击 AppWidget 时获取它的 ID,因为我需要该值才能正确执行某些操作,有什么方法可以以可扩展的方式完成吗?但是获取我点击的appwidget的id已经是很大的帮助了

我使用代码来获取所有 id

但我无法得到我需要的东西,这就是我点击的东西

public class AppWidget extends AppWidgetProvider {

    private static final String MontWidget = "WidgetPreferences";
    private static String ID_CONFIG_WIDGET = "teste_config";

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        RemoteViews views;

        SharedPreferences dados = context.getSharedPreferences(MontWidget, 0);
        Integer posicao = dados.getInt(ID_CONFIG_WIDGET+appWidgetId, 0);

        Log.i("Posicao de selecao", String.valueOf(posicao));

        if (posicao == 0) {

            CharSequence widgetText = Widget_Config.loadTitlePref(context, appWidgetId);

            views = new RemoteViews(context.getPackageName(), R.layout.x1);

            Intent confirmar_acao = new Intent(context, Alert_x1_Activity.class);
            confirmar_acao.putExtra(Alert_x1_Activity.ARG_DIALOG_NUMBER, 1);
            confirmar_acao.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

            PendingIntent confirmar_acao_u = PendingIntent.getActivity(context,
                    0, confirmar_acao, PendingIntent.FLAG_UPDATE_CURRENT);

            views.setOnClickPendingIntent(R.id.btn_X1, confirmar_acao_u);
            views.setOnClickPendingIntent(R.id.txt_x1, confirmar_acao_u);
            views.setTextViewText(R.id.txt_x1,widgetText);

            appWidgetManager.updateAppWidget(appWidgetId, views);
        }

        if (posicao == 1) {
            CharSequence widgetText = Widget_Config.loadTitlePref(context, appWidgetId);

            views = new RemoteViews(context.getPackageName(), R.layout.x2);

            Intent confirmar_acao = new Intent(context, Alert_x2_Activity.class);
            confirmar_acao.putExtra(Alert_x2_Activity.ARG_DIALOG_NUMBER, 1);
            confirmar_acao.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

            PendingIntent confirmar_acao_u = PendingIntent.getActivity(context,
                    0, confirmar_acao, PendingIntent.FLAG_UPDATE_CURRENT);

            views.setOnClickPendingIntent(R.id.btn_x2, confirmar_acao_u);
            views.setOnClickPendingIntent(R.id.txt_x2, confirmar_acao_u);
            views.setTextViewText(R.id.txt_x2,widgetText);

            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        System.out.println("onUpdate");
        final int N = appWidgetIds.length;

        RemoteViews views;
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

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

            intent.putExtra("KEY_ID",appWidgetId);

            PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, 0);
            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            views = new RemoteViews(context.getPackageName(), R.layout.x1_widget);
            views.setOnClickPendingIntent(R.id.btn_x1, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetId, views);
        }

    }

【问题讨论】:

    标签: android android-appwidget appwidgetprovider


    【解决方案1】:

    我们看一下来自documentation的例子:

    public class ExampleAppWidgetProvider extends AppWidgetProvider {
    
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;
    
        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
                int appWidgetId = appWidgetIds[i];
    
                // Create an Intent to launch ExampleActivity
                Intent intent = new Intent(context, ExampleActivity.class);
                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    
                // Get the layout for the App Widget and attach an on-click listener
                // to the button
                RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
                views.setOnClickPendingIntent(R.id.button, pendingIntent);
    
                // Tell the AppWidgetManager to perform an update on the current app widget
                appWidgetManager.updateAppWidget(appWidgetId, views);
            }
        }
    }
    

    在 for 循环中,您知道当前正在更新的 AppWidget 的 appWidgetId。所以你可以使用这个 appWidgetId 并将其作为 Intent 额外传递:

    // ...
    // Create an Intent to launch ExampleActivity
    Intent intent = new Intent(context, ExampleActivity.class);
    // Put the current appWidgetId as Intent extra:
    intent.putExtra("KEY_ID", appWidgetId);
    // Use the appWidgetId (or any unique int value) as request code for the PendingIntent. 
    // Note: two PendingIntents with the same "content intent" 
    // and the same request code *are the same PendingIntent* !
    PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, 0);
    //...
    

    ExampleActivity 中,您会得到 appWidgetId,如下所示:

    int widgetId = getIntent().getIntExtra("KEY_ID", -1);
    

    (或者如果您将启动模式设置为“singleTop”或者如果您使用了Intent.FLAG_ACTIVITY_SINGLE_TOP 标志,那么带有id 的Intent 将被传递到onNewIntent(Intent) 中的ExampleActivity

    请注意,appWidgetId 不以 0 开头(我用两个 App Widget 进行了测试,它们有数字 5 和 6)但是这段代码 sn-p 只是为了向您展示您可以使用 @ 传递信息987654332@ 将帮助您识别您的 App Widget。(不仅是 int 值,请参阅 Intent.putExtra()

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2014-04-19
      • 2018-05-14
      • 1970-01-01
      相关资源
      最近更新 更多