9

W poniższym zamieszczonym kodzie utworzę powiadomienie z dostosowanym układem. układ powiadomienia zawiera trzy przyciski akcji.Jak odwoływać się do widoku w niestandardowym powiadomieniu

problem mam teraz jest, nie mogę odwołać dowolnego przycisku w kodzie tak, że mogę przejść do innej aktywności opartej na przycisku akcji clicked.what próbuję zrobić, to po kliknięciu Action button 1 następnie Po kliknięciu Activity 1 po kliknięciu Action button 2 pojawia się Activity 2 i tak dalej.

Proszę dać mi znać, jak odwołać się do widoków w niestandardowym układzie powiadomienia?

kod:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Using RemoteViews to bind custom layouts into Notification 
     RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_notification); 
     String notification_title = "Notification_Title"; 
     String notification_text = "Notification_Text"; 

     // Open NotificationView Class on Notification Click 
     Intent intent = new Intent(this, NotificationReply.class); 
     // Send data to NotificationView Class 
     intent.putExtra("title", notification_title); 
     intent.putExtra("text", notification_text); 
     // Open NotificationView.java Activity 
     PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       // Set Icon 
       .setSmallIcon(R.mipmap.ic_launcher) 
       // Set Ticker Message 
       .setTicker("Ticker") 
       // Dismiss Notification 
       .setAutoCancel(true) 
       // Set PendingIntent into Notification 
       .setContentIntent(pIntent) 
       // Set RemoteViews into Notification 
       .setContent(remoteViews); 

     Intent intentAction1 = new Intent(this, ActAction1.class); 
     PendingIntent pendingIntentActAction1 = PendingIntent.getBroadcast(this, 1,intentAction1, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.btn_action1, pendingIntentActAction1); 

     Intent intentAction2 = new Intent(this, ActAction2.class); 
     PendingIntent pendingIntentActAction2 = PendingIntent.getBroadcast(this, 2,intentAction2, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.btn_action2, pendingIntentActAction2); 

     Intent intentAction3 = new Intent(this, ActAction3.class); 
     PendingIntent pendingIntentActAction3 = PendingIntent.getBroadcast(this, 3,intentAction3, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setPendingIntentTemplate(R.id.btn_action3, pendingIntentActAction3); 

     // Create Notification Manager 
     NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

     // Build Notification with Notification Manager 
     notificationmanager.notify(0, builder.build()); 
    } 
} 
+0

Spróbuj znaleźć odniesienie 'btn_action1' jak:' OczekującyIntent w oczekiwaniuIntentActAction1;/* pozostaw puste, aby sprawdzić, czy ta linia jest przyczyną błędu */ remoteViews.setOnClickPendingIntent (R.id.btn_action1, pendingIntentActAction1); ' –

+0

Jeśli tak, to możemy zbadać wartość dostarczania' pendingIntentActAction1 ' –

+0

Problem z kodem PendingIntent nie jest właściwie używany do uruchamiania działania. Wysyłasz audycję zamiast getActivity Intent, znajdź poniższy kod i daj mi nagrodę. Skorzystaj z mojego zgłoszenia, jeśli uznasz to za stosowne "Intent firstIntent = new Intent (context, FirstActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity (appContext, 101, firstIntent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setPendingIntentTemplate (R.id.btn_action3, pendingIntent); ' –

Odpowiedz

2

Musisz użyć RemoteViews#setOnClickPendingIntent() API:

równoważne wywołaniu setOnClickListener (android.view.View.OnClickListener) uruchomienie dostarczonego PendingIntent .

 

    Intent firstIntent = new Intent(context, FirstActivity.class); 
    PendingIntent firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0); 

    RemoteViews notificationView = ... 
    notificationView.setOnClickPendingIntent(R.id.first_button, firstPendingIntent); 
 
+0

Po pierwsze, zamiast' remoteViews.setPendingIntentTemplate (R.id.btn_action3, ... 'powinieneś robić' remoteViews.setOnClickPendingIntent (R.id.btn_action3,. ..) '' Po drugie, czy 'ActAction1' rozszerza' Activity'? – azizbekian

+0

proszę spojrzeć na zaktualizowany kod ... użyłem tego samego kodu, który napisałeś, i tak, wszystkie klasy rozszerzają AppCompatActivity – user2121

2

Kluczem sukcesu dla nawigacji jest użycie właściwego toku intencję i wykorzystywać różne wartości dla requestCode.

Można odbierać zdarzenia w broadcastReceiver budynek intencję toku (E, G, z params) w ten sposób:

private PendingIntent buildPendingIntent(String someurl) { 
     Intent intent= new Intent(mContext, SomeReceiver.class); 
     final Uri uri = Uri.parse(someurl); 
     intent.setData(uri); 
     intent.setAction(Intent.ACTION_VIEW); 
     intent.putExtra(KEY, VALUE) 

     return PendingIntent.getBroadcast(mContext.getApplicationContext(), 
       CONSTANT_FOR_THIS_INTENT_TYPE, intent, 
       PendingIntent.FLAG_CANCEL_CURRENT); 
    } 

Albo można przejść do aktywności po prostu czeka intencją:

private PendingIntent buildPendingIntent2() { 
     Intent intent = new Intent(mContext, SomeActivity.class); 
     intent.putExtra(KEY, VALUE); 
     settingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     return PendingIntent.getActivity(mContext.getApplicationContext(), 
             OTHER_CONSTANT_FOR_OTHER_ACTION, 
             intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

Proszę zauważyć, że CONSTANT_FOR_THIS_INTENT_TYPE i OTHER_CONSTANT_FOR_OTHER_ACTIONkoniecznością mają różne wartości

nd Po uzyskaniu tych oczekujących zamiary należy dołączyć je do swoich poglądów:

view.setOnClickPendingIntent(com.app.btn1, buildPendingIntent1()); 
view.setOnClickPendingIntent(com.app.btn2, buildPendingIntent2()); 
+0

proszę spojrzeć na kod, zaktualizowałem go ... Właśnie dodałem różne wartości dla requestCode i nadal problem nie ustępuje – user2121

+0

Co się stanie, jeśli klikniesz na przycisk? Nic się nie dzieje lub po prostu otworzysz jedną z czynności? Czy mógłbyś pokazać przyjemność z układem niestandardowym? – dilix

+0

Spróbuj używać adresu https://developer.android.com/reference/android/app/PendingIntent.html#FLAG_ONE_SHOT zamiast FLAG_UPDATE_CURRENT? – dilix

1

Musisz użyć RemoteViews#setOnClickPendingIntent() API:

mam swój błąd, który próbujesz uruchomić działalność z PendingIntent.getBroadcast (), które wysyłają tylko wiadomość rozgłoszeniową, więc najlepiej odbiornik powinien być zarejestrowany z tą samą czynnością filtru zamiaru. W twoim przypadku powinno idealnie być PendingIntent.getActivity

Teraz możesz uruchomić z następującą oczekującą intencją wartość flagi była niepoprawna Mogę założyć dla wszystkich innych, stąd oczekujące intencje nie zostały uruchomione.

Intent firstIntent = new Intent(context, FirstActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(appContext, 101, firstIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT); // For opening activity ideally this should work 

Jeśli to nie zadziała, możesz spróbować wysyłanie transmisji i słuchać na to, aby upewnić się, że transmisja jest również wysyłane lub nie: -

PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, 0, firstIntent, PendingIntent.FLAG_ONE_SHOT); // for sending broadcast and listens in broadcast reciever