0

我正在尝试使用小部件创建应用程序。当用户将小部件放在桌面上时,列表视图应该会显示一个项目列表。用户选择一个项目,然后使用与该项目相关的相应文本创建小部件。为简单起见,我现在使用警报对话框。输入文本应该只出现在我创建的小部件中。它不应出现在其他小部件中。我该怎么做?我没有发现任何关于此的信息。

AppWidgetProvider:

public class MyWidgetProvider extends AppWidgetProvider {

    private static final String ACTION_CLICK = "ACTION_CLICK";

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

        Log.i("INFO", "AppWidgetProvider"); 

        ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        //Intent intent = new Intent(context.getApplicationContext(),   UpdateWidgetService.class);
        //intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
        //context.startService(intent);
            Intent intentA = new Intent(context.getApplicationContext(), NoteListToWidget.class);
    intentA.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intentA);

        }

}

服务:

public class UpdateWidgetService extends Service {
    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
    String value;
    Dialog dialog_newitem;


    @Override
    public void onStart(Intent intent, int startId) {
        Log.i("INFO", "UpdateWidgetService");

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());

        int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

        ComponentName thisWidget = new ComponentName(getApplicationContext(), MyWidgetProvider.class);
        int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);

        for (int widgetId : allWidgetIds) {
            int number = (new Random().nextInt(100));
            String v = GlobalVars.getValue();
            RemoteViews remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(), R.layout.widget_layout);
            //remoteViews.setTextViewText(R.id.update, "Random: " + String.valueOf(number));
            remoteViews.setTextViewText(R.id.update, v);

            Intent configIntent = new Intent(this, Notepad.class);
            configIntent.setAction(ACTION_WIDGET_CONFIGURE);
            PendingIntent configPendingIntent = PendingIntent.getActivity(this, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.widgetlayout, configPendingIntent);

            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }
        stopSelf();

        super.onStart(intent, startId);


    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

这是带有 AlertDialog 的 Activity(后一个列表视图):

public class NoteListToWidget extends Activity {

    Dialog dialog_newitem;
    EditText et_newitem;
    String value;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        dialog_newitem = new Dialog(NoteListToWidget.this);
        dialog_newitem.setContentView(R.layout.dialog_productlists_grp_capitalized);
        dialog_newitem.setTitle("Select");
        dialog_newitem.setCancelable(true);

        et_newitem = (EditText) dialog_newitem.findViewById(R.id.et_item_name);

        Button btn_Save = (Button) dialog_newitem.findViewById(R.id.btn_save_pr);
        btn_Save.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                value = et_newitem.getText().toString();
                 GlobalVars.setValue(value);
                dialog_newitem.dismiss();
                /*
                Intent serviceIntent = new Intent();
                serviceIntent.setAction("com.myapp.app.UpdateWidgetService");
                startService(serviceIntent);
                */
                Intent intent = new Intent(NoteListToWidget.this, com.myapp.app.UpdateWidgetService.class);
                startService(intent);

            }
            });


        Button btn_Cancel = (Button) dialog_newitem.findViewById(R.id.btn_cancel_pr);
        btn_Cancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog_newitem.dismiss();
            }

        });
        dialog_newitem.show();



    }

}

我不知道我应该如何以及从哪里调用 NoteListToWidget 活动以及如何使这一切正常工作。

4

1 回答 1

1

首先,不可能完整地回答您的问题。这是因为您似乎遗漏了很多关于应用程序小部件如何工作的信息,因此您必须阅读更多关于它们的信息。不过,我会给你一个开始的地方。

AppWidgetProvider 的 onUpdate 方法在每次已经放置在桌面上的应用小部件需要更新时被调用。也就是说,即使您设法从那里显示您的列表并且用户取消了操作,也无法从 onUpdate 方法中删除您的应用程序小部件。此外,当 onUpdate 方法完成时,AppWidgetProvider 将被销毁,因此即使您设法从那里显示您的列表,也无法获取用户选择的项目。长话短说,你不能从 onUpdate 方法做到这一点,你不能用这种方法做到这一点。

但是,您可以通过在应用小部件创建过程的指定点使用配置活动来做到这一点,但这无法在您的问题上下文中回答,因为您必须首先了解应用小部件系统在 Android 中的工作原理。最好的起点是这个链接。我的第一个 app-widget 应用程序遇到了同样的问题(你的问题几乎相同),但后来我开始阅读和阅读,最终在 1.5 个月后,我设法做出了你想做的事情。所以不要说

我该怎么做?我还没有找到任何关于这个

开始阅读吧,这就是 Android 的生活。这一切都在上面的链接中,谷歌代码中也有非常好的开源项目,比如这个天气小部件,它允许用户在将它放在桌面上之前对其进行配置。

希望这可以帮助...

于 2012-05-13T17:24:03.160 回答