2017-06-17 1 views
0

私は解決できないアプリに問題があります。アプリはユーザーから入力(リマインダ)を受け取り、それを通知として設定します。ユーザーは、好きなだけ多くの通知を作成できます。ユーザーが通知をクリックして新しいアクティビティ(リマインダ)に移動するようにして、リマインダーをTextViewで表示できるようにします。だから私は、ユーザーが自分のデータをテキストエディタに置くことを可能にするアクティビティ(SetReminder)を持っています。その後、彼のデータをhashMapに保存します。 intはユーザーの文字列データのIDです。それから私はBroacastReceiverを拡張し、通知を生成するクラス(AlarmReceiver)があります。このクラスでは、SetReminderアクティビティからのhashMapのintと一致する各通知のIDを持っています。そうすれば、ユーザーは各通知のデータを見ることになると予想していました。しかし、それは起こりません。私は複数の通知(私はそれが欲しい)が、どの通知が選択されても、最後の通知のデータが表示されます。私は3つの活動からコードを掲示しています。 ありがとうございます。複数の異なるデータによる通知

SetReminder.class

package demo.push_not_demo; 


    import android.graphics.PorterDuff; 
    import android.os.Bundle; 
    import android.support.v7.app.AppCompatActivity; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.Button; 
    import android.app.AlarmManager; 
    import android.app.PendingIntent; 
    import android.content.Intent; 
    import android.os.SystemClock; 
    import android.widget.EditText; 
    import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment; 
    import java.util.HashMap; 



    public class SetReminder extends AppCompatActivity { 

private SwitchDateTimeDialogFragment dateTimeFragment; 
Button b1,b2,b3; 
EditText editText; 
public static int counter=0; 
public static HashMap<Integer,String> hashMap; 
private static final String TAG_DATETIME_FRAGMENT = "TAG_DATETIME_FRAGMENT"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.set_reminder); 
    hashMap= new HashMap<Integer, String>(); 
    b1=(Button) findViewById(R.id.set_date_time); 
    b2=(Button) findViewById(R.id.cancel); 
    b3=(Button) findViewById(R.id.save); 
    b1.setOnTouchListener(touch); 
    b2.setOnTouchListener(touch); 
    b3.setOnTouchListener(touch); 
    editText=(EditText) findViewById(R.id.reminder_edit); 
} 

View.OnTouchListener touch= new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (v.getId()){ 
      case R.id.set_date_time: 
       if (event.getAction()==MotionEvent.ACTION_DOWN){ 
        v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP); 
        v.invalidate(); 
       } 
       else if (event.getAction()== MotionEvent.ACTION_UP){ 
        v.getBackground().clearColorFilter(); 
        v.invalidate(); 
        // Construct SwitchDateTimePicker 
        dateTimeFragment = (SwitchDateTimeDialogFragment) getSupportFragmentManager().findFragmentByTag(TAG_DATETIME_FRAGMENT); 
        if(dateTimeFragment == null) { 
         dateTimeFragment = SwitchDateTimeDialogFragment.newInstance(
           getString(R.string.label_datetime_dialog), 
           getString(R.string.positive_button_datetime_picker), 
           getString(R.string.negative_button_datetime_picker) 
         ); 
        } 
        dateTimeFragment.show(getSupportFragmentManager(), TAG_DATETIME_FRAGMENT); 
       } 
      break; 
      case R.id.cancel: 
       if (event.getAction()==MotionEvent.ACTION_DOWN){ 
        v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP); 
        v.invalidate(); 
        cancelalarm(); 
       } 
       else if (event.getAction()== MotionEvent.ACTION_UP){ 
        v.getBackground().clearColorFilter(); 
        v.invalidate(); 
        Intent intent = new Intent(SetReminder.this,HomeScreen.class); 
        startActivity(intent); 
       } 
      break; 
      case R.id.save: 
       if (event.getAction()==MotionEvent.ACTION_DOWN){ 
        v.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP); 
        v.invalidate(); 

       } 
       else if (event.getAction()== MotionEvent.ACTION_UP){ 
        v.getBackground().clearColorFilter(); 
        v.invalidate(); 
        counter++; 
        hashMap.put(counter,editText.getText().toString()); 
        alarmservice(); 
       } 
      break; 
     } 
     return false; 
    } 
}; 

public void alarmservice(){ 
    Intent intent = new Intent(this,AlertReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(alarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+ 5000,pendingIntent); 
} 

public void cancelalarm(){ 
    Intent intent = new Intent(this,AlertReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.cancel(pendingIntent); 
} 
    } 

AlertReceiver.class

package demo.push_not_demo; 

    import android.app.Notification; 
    import android.app.NotificationManager; 
    import android.app.PendingIntent; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.support.v4.app.NotificationCompat; 
    import android.widget.EditText; 

    import java.util.HashMap; 

    import static android.support.v4.app.NotificationCompat.DEFAULT_SOUND; 
    import static android.support.v4.app.NotificationCompat.PRIORITY_HIGH; 
    import static android.support.v4.app.NotificationCompat.VISIBILITY_PUBLIC; 

    public class AlertReceiver extends BroadcastReceiver { 

public static int id=0; 

@Override 
public void onReceive(Context context, Intent intent) { 
    id++; 
    createNotification(context); 
} 

private void createNotification(Context context) { 

    NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 
     .setAutoCancel(true) 
     .setSmallIcon(R.drawable.offer1) 
     .setContentTitle("Notification Title") 
     .setContentText("Tap to see your reminder") 
     .setPriority(PRIORITY_HIGH) 
     .setVibrate(new long[] { 50, 1000, 500, 1000, 1000 }) 
     .setDefaults(DEFAULT_SOUND) 
     .setVisibility(VISIBILITY_PUBLIC); 

    Intent intent = new Intent(context,Reminder.class); 

    PendingIntent pendingintent = PendingIntent.getActivity(context,id,intent,PendingIntent.FLAG_ONE_SHOT); 
    notification.setContentIntent(pendingintent); 
    NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification ntfc = notification.build(); 
    nm.notify(id,ntfc); 
} 


    } 

Reminder.class

package demo.push_not_demo; 


    import android.os.Bundle; 
    import android.support.annotation.Nullable; 
    import android.support.v7.app.AppCompatActivity; 
    import android.widget.TextView; 

    import static demo.push_not_demo.AlertReceiver.id; 
    import static demo.push_not_demo.SetReminder.hashMap; 

    public class Reminder extends AppCompatActivity{ 


TextView txtv; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.reminder); 
    txtv=(TextView) findViewById(R.id.reminder_textView); 
    txtv.setText(hashMap.get(id)); 

} 
    } 

答えて

0

あなたのコードIDは常にあなたがチェックすることができます0です。で、静的なIDを使用してはいけませんそれはログを使用して! 異なるIDを生成する別の方法を使用します。

同じIDの通知を追加すると、新しい通知が最後の通知に置き換えられます。 idにランダムな整数を使用する

+0

静的でない場合は、別のクラスの変数にどのようにアクセスするのですか? Logを使う方法について私に教えてもらえますか? –

+0

と私は、IDが常に0だったと思いますが、私はリマインダのアクティビティに何も表示されませんでした。私はデータを見ることができると伝えています...しかし、常に最後のデータです。 私が間違っている場合は私を修正してください... –

+0

私は私の答えを編集 –

関連する問題