1

actionbarsherlock にメニュー項目があるプログラムを作成しています。今、私はユーザーがそのメニューを 1 日に 1 回クリックするようにしたいと考えています。どうすればこれを達成できますか? これが私がこれまでに持っているものです:

int hour = today.get(Calendar.HOUR_OF_DAY);

if (hour < 24) {

    try {
        if (gotGenders.contentEquals("Male")) {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                    Monitor.this);
            alertDialog.setTitle(gotNames);
            alertDialog.setMessage("You are currently burning "
                    + caloriesForMen() + " calories per hour");
            alertDialog.setPositiveButton("Save",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub

                        }
                    });

            alertDialog.setNegativeButton("Discard",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub
                            dialog.dismiss();
                        }
                    });

            alertDialog.setCancelable(false);
            showAlertDialog = alertDialog.create();
            showAlertDialog.show();
        }
        else if (gotGenders.contentEquals("Female")) {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                    Monitor.this);
            alertDialog.setTitle(gotNames);
            alertDialog.setMessage("You are currently burning "
                    + caloriesForWomen() + " calories per hour");
            alertDialog.setPositiveButton("Save",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub
                            // dialog.dismiss();
                        }
                    });

            alertDialog.setNegativeButton("Discard",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub
                            dialog.dismiss();
                        }
                    });

            alertDialog.setCancelable(false);
            showAlertDialog = alertDialog.create();
            showAlertDialog.show();

            count = 1;
        }
    } catch (Exception ex) {
        ex.printStackTrace();

        AlertDialog.Builder errorDialog = new AlertDialog.Builder(
                Monitor.this);
        errorDialog.setTitle("No User Selected!");
        // errorDialog.setMessage("You are currently burning " +
        // caloriesForWomen() + " per hour");
        errorDialog.setPositiveButton("OK",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog,
                            int which) {
                        // TODO Auto-generated method stub
                        dialog.dismiss();
                    }
                });

        errorDialog.setCancelable(false);
        errorAlertDialog = errorDialog.create();
        errorAlertDialog.show();
    }
} else {
    count = 0;

    AlertDialog.Builder waitDialog = new AlertDialog.Builder(
            Monitor.this);
    waitDialog.setTitle("Wait after the day is over");
    waitDialog.setPositiveButton("OK",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();
                }
            });

    waitDialog.setCancelable(false);
    waitAlertDialog = waitDialog.create();
    waitAlertDialog.show();
}

これにより、メニューを複数回選択できるようになります。1 日に 1 回のクリックに制限するにはどうすればよいですか? どんな助けでも感謝します。

4

2 に答える 2

2

これを実現するには、最後にアクセスした日付をどこかに保存する必要があります (データベース、共有設定、ファイル内)。

long lastVistedDateTime = getLastVistedDateTime();
int lastDay = new Date(lastVistedDateTime).getDay();
int today = Calendar.get(Calendar.DATE);
if (today != lastDay){
    //an other day
    setLastVistedDateTime(Calendar.getInstance().getTimeInMillis());
}

日付を現在のロケールと比較するには、次を使用します。

String lastDate = DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date(lastVistedDateTime));
String nowDate = DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date());
if (!nowDate.equals(lastDate)){
    //an other day
    setLastVistedDateTime(Calendar.getInstance().getTimeInMillis());
}
于 2012-12-30T09:41:53.793 に答える
2

一般的に、gezdy の回答には正しいアプローチがあると思いますが、簡略化を提案したいと思います。

Calendar.DAY_OF_YEAR http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#DAY_OF_YEAR

現在の日付 (1 ~ 365) を返します。したがって、ミリ秒単位で計算するのではなく、その値を取得して保存し、その後の試行で比較します。gezdy の回答のコードを約 3 行に減らす必要があります (まったく同じことを行いながら)。

考えられる唯一の欠点は、

  1. ユーザーは自分のデバイスの時計を変更できます
  2. ユーザーがアプリを年に 1 回しか使用せず、1 年後のまったく同じ日にアプリを使用する場合、意図しないアプリの使用防止が発生する可能性があります。(非常にありそうもない)。
于 2012-12-30T09:56:37.947 に答える