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(後者のリストビュー)を使用したアクティビティです。

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 メソッドから app-widget を削除する方法はありません。さらに、onUpdate メソッドが終了すると AppWidgetProvider が破棄されるため、そこからリストを表示できたとしても、ユーザーが選択したアイテムを取得する方法はありません。簡単に言えば、 onUpdate メソッドからは実行できず、このアプローチでは実行できません

ただし、 app-widget の作成プロセスの指定された時点で構成アクティビティを使用してそれを行うことはできますが、Android で app-widget システムがどのように機能するかを最初に理解する必要があるため、質問のコンテキストではこれに答えることができません。開始するのに最適な場所は、このリンクです。私は最初のアプリ ウィジェット アプリケーションで同じ問題を抱えていました (そして、あなたとほとんど同じ懸念を抱いていました) が、その後、何度も何度も読み始めました。だから言わないで

どうすればいいですか?私はこれについて何も見つけていません

読み始めてください。これが Android のある生活です。それはすべて上記のリンクにあります。また、デスクトップに配置する前にユーザーが構成できるこの天気ウィジェットのような非常に優れたオープンソース プロジェクトが Google コードにあります。

お役に立てれば...

于 2012-05-13T17:24:03.160 に答える