Android添加更多具有不同内容的小部件

时间:2012-05-13 11:42:05

标签: android widget

我正在尝试使用窗口小部件创建应用程序。当用户将小部件放在桌面上时,列表视图应该提供一个项目列表。用户选择项目,然后使用与该项目相关的相应文本创建窗口小部件。为简单起见,我现在使用alertdialog。输入文本应仅出现在我创建的小部件中。它不应该出现在其他小部件中。我该怎么做?我没有发现任何关于此的事情。

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的活动(后者列表视图):

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活动以及如何使这一切完成。

1 个答案:

答案 0 :(得分:1)

首先,完全无法回答你的问题。这是因为你似乎缺少很多关于app-widgets如何工作的东西,所以你必须阅读更多关于它们的信息。但是我会给你一个开始的地方。

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

但是,你可以做到是通过在app-widget的创建过程的指定点使用配置活动但是在你的问题的上下文中无法回答这个问题,因为你必须先了解app-widget系统适用于Android。最好的起点是this link。我的第一个app-widget应用程序遇到了同样的问题(和你几乎一样的问题)然后我开始阅读和阅读,最后在1.5个月之后我设法做了类似你想做的事情。所以不要说

  

我该怎么做?我没有发现任何关于这个

的事情

并开始阅读,这是Android的生活。总而言之,在上面的链接中,谷歌代码like this weather widget中也有非常好的开源项目,允许用户在将其放置在桌面之前对其进行配置。

希望这会有所帮助......