2017-05-02 6 views
1

私は少し問題があります。私が助けてくれれば非常に感謝しています。私はクライアント薬のためのローカルデータベースのようなアプリを持っています。ピルを追加するときに、特定のピルを取る必要があるときに通知を追加することができます。彼は1時間しか設定できず、その週から数日を選択することができます。だから、アプリは、その特定の時間に毎日のためのアラームをしている、私のアプリは多くのアラームを作っている、私はそれが最良の方法だとは思わないが、それは私が作った方法です。これを行うより良い方法なら、私を助けてください。しかし、今私の主な問題は、クライアントが薬を削除したいときに、それぞれの錠剤からアラームを無効にできるように保留中の意図を保存する方法です。それぞれのオブジェクトのアラームを保存および削除する方法

public class Home extends AppCompatActivity implements View.OnClickListener { 

////////////////////DECLARARI/////////////////// 
LinearLayout[] med = new LinearLayout[11]; 
TextView[] name = new TextView[11]; 
TextView[] nr = new TextView[11]; 
TextView[] plus = new TextView[11]; 
TextView[] minus = new TextView[11]; 
TextView[] info = new TextView[11]; 

public static final String PREFS_NAME = "MyMeds"; 
//////////////////////////////////////////////// 

public void calendar(View view, final EditText dateMed){ 
    final Calendar calendar = Calendar.getInstance(); 
    final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener(){ 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      calendar.set(Calendar.YEAR, year); 
      calendar.set(Calendar.MONTH, monthOfYear); 
      calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

      String data = "dd/MM/yy"; 
      SimpleDateFormat sdf = new SimpleDateFormat(data, Locale.ENGLISH); 
      dateMed.setText(sdf.format(calendar.getTime())); 
     } 
    }; 

    view.findViewById(R.id.dateMed).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new DatePickerDialog(Home.this, date, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show(); 
     } 
    }); 
} 

public void clock(View view, final Calendar setat){ 
    final TextView ora = (TextView)view.findViewById(R.id.clock); 
    ora.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final Calendar time = Calendar.getInstance(); 
      int hour = time.get(Calendar.HOUR_OF_DAY); 
      int minute = time.get(Calendar.MINUTE); 

      TimePickerDialog timePickerDialog; 
      timePickerDialog = new TimePickerDialog(Home.this, new TimePickerDialog.OnTimeSetListener(){ 
       @Override 
       public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute){ 
        if(selectedHour < 10 && selectedMinute >= 10) ora.setText("0"+selectedHour + ":" + selectedMinute); 
        if(selectedHour >= 10 && selectedMinute < 10) ora.setText(selectedHour + ":" + "0" + selectedMinute); 
        if(selectedHour < 10 && selectedMinute < 10) ora.setText("0" + selectedHour + ":" + "0" + selectedMinute); 
        if(selectedHour >= 10 && selectedMinute >= 10) ora.setText(selectedHour + ":" + selectedMinute); 
        setat.set(Calendar.HOUR_OF_DAY, selectedHour); 
        setat.set(Calendar.MINUTE, selectedMinute); 
       } 
      }, hour, minute, true); 
      timePickerDialog.setTitle(""); 
      timePickerDialog.show(); 
     } 
    }); 
} 

public void setAlarm(int day , Calendar setat){ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.DAY_OF_WEEK, day+1); 
    calendar.set(Calendar.HOUR_OF_DAY, setat.get(Calendar.HOUR_OF_DAY)); 
    calendar.set(Calendar.MINUTE, setat.get(Calendar.MINUTE)); 
    calendar.set(Calendar.SECOND, 0); 

    long time = calendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis(); 

    Log.d("day", String.valueOf(calendar.get(Calendar.DAY_OF_WEEK))); 
    Log.d("time", String.valueOf(setat.get(Calendar.HOUR_OF_DAY)) + ":" + String.valueOf(setat.get(Calendar.MINUTE))); 
    Log.d("actual", String.valueOf(Calendar.getInstance().get(Calendar.MINUTE))); 

    Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), Calendar.getInstance().get(Calendar.MILLISECOND), intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(ALARM_SERVICE); 

    if(calendar.getTimeInMillis() > System.currentTimeMillis()) 
     Log.d("bigger", "yes"); 
    else 
     Log.d("bigger", "no"); 

    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
} 

public void addMedNou(){ 
    findViewById(R.id.add).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(Home.this); 
      View view = getLayoutInflater().inflate(R.layout.adddialog, null); 
      builder.setView(view); 
      final AlertDialog dialog = builder.create(); 

      final EditText nameMed = (EditText)view.findViewById(R.id.nameMed); 
      final EditText nrMed = (EditText)view.findViewById(R.id.nrMed); 
      final EditText comm = (EditText)view.findViewById(R.id.comm); 
      final EditText dateMed = (EditText)view.findViewById(R.id.dateMed); 
      FrameLayout add = (FrameLayout)view.findViewById(R.id.add); 
      FrameLayout cancel = (FrameLayout)view.findViewById(R.id.cancel); 
      calendar(view, dateMed); 
      reminder(view); 

      add.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(!nameMed.getText().toString().isEmpty() && !nrMed.getText().toString().isEmpty()){ 
         SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
         SharedPreferences.Editor edit = valoriSalvate.edit(); 

         int total = valoriSalvate.getInt("total", 0); 
         total++; 
         if(total <= 10){ 
          edit.putInt("total", total); 
          edit.putString("nume" + total, nameMed.getText().toString()); 
          edit.putInt("nr" + total, Integer.parseInt(nrMed.getText().toString())); 
          edit.putString("comm" + total, comm.getText().toString()); 
          edit.putString("date" + total, dateMed.getText().toString()); 
         } 
         edit.commit(); 
         dialog.dismiss(); 
         Intent repeat = new Intent(Home.this, Home.class); 
         startActivity(repeat); 
        } 
        else 
         dialog.dismiss(); 
       } 
      }); 

      cancel.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
       } 
      }); 

      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dialog.show(); 
     } 
    }); 
} 

public void reminder(final View view){ 
    view.findViewById(R.id.reminder).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AlertDialog.Builder reminder = new AlertDialog.Builder(Home.this); 
      final View layout = getLayoutInflater().inflate(R.layout.alarm, null); 
      reminder.setView(layout); 
      final AlertDialog dialog = reminder.create(); 

      final Calendar setat = Calendar.getInstance(); 
      clock(layout, setat); 
      layout.findViewById(R.id.confirm).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        CheckBox[] boxes = new CheckBox[8]; 
        boxes[0] = (CheckBox)layout.findViewById(R.id.check0); 
        boxes[1] = (CheckBox)layout.findViewById(R.id.check1); 
        boxes[2] = (CheckBox)layout.findViewById(R.id.check2); 
        boxes[3] = (CheckBox)layout.findViewById(R.id.check3); 
        boxes[4] = (CheckBox)layout.findViewById(R.id.check4); 
        boxes[5] = (CheckBox)layout.findViewById(R.id.check5); 
        boxes[6] = (CheckBox)layout.findViewById(R.id.check6); 

        if(boxes[0].isChecked()) {setAlarm(1, setat);} 
        if(boxes[1].isChecked()) {setAlarm(2, setat);} 
        if(boxes[2].isChecked()) {setAlarm(3, setat);} 
        if(boxes[3].isChecked()) {setAlarm(4, setat);} 
        if(boxes[4].isChecked()) {setAlarm(5, setat);} 
        if(boxes[5].isChecked()) {setAlarm(6, setat);} 
        if(boxes[6].isChecked()) {setAlarm(7, setat);} 

        Toast.makeText(Home.this, "Alarm has been set!", Toast.LENGTH_SHORT).show(); 
        dialog.dismiss(); 
       } 
      }); 

      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dialog.show(); 
     } 
    }); 
} 

public void declarari(){ 
    for(int i=1;i<=10;i++){ 
     String mID = "m" + i; 
     String nrID = "nr" + i; 
     String nameID = "name" + i; 
     String plusID = "plus" + i; 
     String minusID = "minus" + i; 
     String infoID = "info" + i; 
     int resID = getResources().getIdentifier(mID, "id", getPackageName()); 
     int resNrID = getResources().getIdentifier(nrID, "id", getPackageName()); 
     int resNameID = getResources().getIdentifier(nameID, "id", getPackageName()); 
     int resPlusID = getResources().getIdentifier(plusID, "id", getPackageName()); 
     int resMinusID = getResources().getIdentifier(minusID, "id", getPackageName()); 
     int resInfoID = getResources().getIdentifier(infoID, "id", getPackageName()); 
     med[i] = ((LinearLayout)findViewById(resID)); 
     nr[i] = ((TextView)findViewById(resNrID)); 
     name[i] = ((TextView)findViewById(resNameID)); 
     plus[i] = ((TextView)findViewById(resPlusID)); 
     plus[i].setOnClickListener(this); 
     minus[i] = ((TextView)findViewById(resMinusID)); 
     minus[i].setOnClickListener(this); 
     info[i] = ((TextView)findViewById(resInfoID)); 
     info[i].setOnClickListener(this); 
    } 
} 

public void afisare(){ 
    SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor edit = valoriSalvate.edit(); 

    int total = valoriSalvate.getInt("total", 0); 
    for(int i=1;i<=total;i++){ 
     med[i].setVisibility(View.VISIBLE); 
     String keyNume = "nume" + i; 
     name[i].setText(valoriSalvate.getString(keyNume, null)); 
     String keyNr = "nr" + i; 
     nr[i].setText(String.valueOf(valoriSalvate.getInt(keyNr, 0))); 
    } 

    edit.commit(); 
} 

public void setari(){ 
    findViewById(R.id.setari).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent setari = new Intent(Home.this, setari.class); 
      startActivity(setari); 
     } 
    }); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 
    addMedNou(); 
    setari(); 
    declarari(); 
    afisare(); 
} 

@Override 
public void onClick(View v){ 
    int actual; 

    SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor edit = valoriSalvate.edit(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(Home.this); 
    View info = getLayoutInflater().inflate(R.layout.infoo, null); 
    builder.setView(info); 
    AlertDialog dialog = builder.create(); 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

    TextView title = (TextView)info.findViewById(R.id.title); 
    TextView pastile = (TextView)info.findViewById(R.id.pastile); 
    TextView date = (TextView)info.findViewById(R.id.date); 
    TextView comentariu = (TextView)info.findViewById(R.id.comentariu); 

ご注意いただきありがとうございます。少しでもお手伝いできることを願っております。良い一日を過ごしてください!

+0

CountDownTimerを使用すると、お手伝いをすることができます:これが可能であれば、私はANSを投稿できますhttps://developer.android.com/reference/android/os/CountDownTimer.html – Hamza

+0

あなたのコメントありがとうございます私の場合はうまくいきません。なぜなら、カウントダウンタイマーのために、私は、アラーム間の正確で常に同じ時間を必要とするからです –

答えて

0

このコードに問題があります。まず、複数のアラームを設定しているとします。複数のアラームを設定するには、それぞれPendingIntentが一意であることを保証する必要があります。あなたは、次の操作を行います。

Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    Calendar.getInstance().get(Calendar.MILLISECOND), intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 

あなたのアラームのすべては、あなたがCalendar.MILLISECONDフィールドを使用しているためrequestIdパラメータ(第2引数)を除いて、PendingIntentに同じパラメータを使用します。これはユニークではありませんです。 Calendar.MILLISECONDは、特定のタイムスタンプの2番目の内のミリ秒を表す0〜999の数値を返します。これは一意であるとは限りません。それはそうかもしれないし、そうでないかもしれない。


アラームをキャンセルできるように、PendingIntentを保存する方法を尋ねます。実際には、PendingIntentを保存する必要はありません。アラームをキャンセルするには、PendingIntentを再作成することができます。最初にアラームを設定したときとまったく同じようにしてください。このように:

Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    Calendar.getInstance().get(Calendar.MILLISECOND), intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
// Cancel the alarm 
AlarmManager alarmManager = (AlarmManager)getApplicationContext() 
           .getSystemService(ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
// Now cancel the PendingIntent also (just to be sure) 
pendingIntent.cancel(); 

ここにトリックはPendingIntent.getBroadcast()コールへrequestId(第2引数)は正確にあなたがアラームを設定するときに使用したrequestIdと一致する必要がありますということです。だからあなたはそれを保存しなければならないでしょう。時間のミリ秒部分は一意ではないので、requestIdとして使用するより一意の番号を見つける必要があります。毎日アラームを1つしか設定しない場合は、requestIdとして日番号を使用することができます(例:Calendar.DAY_OF_WEEK)。または、他の独自のIDを使用することもできます。アラームを設定および解除するときは、同じ値を使用します。

関連する問題