webentwicklung-frage-antwort-db.com.de

So öffnen Sie eine Fragmentseite, wenn eine Benachrichtigung in android gedrückt wird

Ich versuche, ein Fragment zu öffnen, wenn ich eine Benachrichtigung in der Benachrichtigungsleiste drücke. Meine App-Struktur ist:

  • eine Basisaktivität mit einem Navigationsmenü
  • einige Fragmente, die über das Menü geöffnet werden

    b.setOnClickListener(new OnClickListener() {
    
            @SuppressWarnings({ "deprecation", "static-access" })
            public void onClick(View v) {
    
            w_nm=(NotificationManager) getActivity().getSystemService(getActivity().NOTIFICATION_SERVICE);
    
             Notification notify=new Notification(R.drawable.notnificationlogo,waternoti,System.currentTimeMillis());
    
             Intent notificationIntent = new Intent(getActivity(), Abc.class);
    
    
    
             PendingIntent pending=PendingIntent.getActivity(getActivity(), 0,notificationIntent, 0);
    
    
             notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                     | Intent.FLAG_ACTIVITY_SINGLE_TOP );
    
            notify.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
    
               notify.setLatestEventInfo(getActivity(),waternoti,waternoti1, pending);
    
             w_nm.notify(0, notify);
    

Kann mir jemand sagen, wie ich mit der nächsten Fragmentseite verlinken soll (der vorliegende Code ist in einer Klasse, die Fragmente erweitert)

Sie müssen Ihre Basisaktivität wie gewohnt starten, aber der Absicht, welches Menüfragment geöffnet wird, einige zusätzliche Informationen hinzufügen. Hier können Sie sehen, wie es gemacht werden kann: https://stackoverflow.com/a/8610916/1652236

Dies hängt von den zusätzlichen Informationen ab, die Sie in der Methode 'onCreate ()' der Aktivitäten abrufen, mit der Sie das Fragment starten/laden.

Sehen Sie hier zum Beispiel, wie Sie mit Fragmenten arbeiten: http://www.tutorialspoint.com/Android/android_fragments.htmhttp://developer.Android.com/guide/components/fragments .html

Es ist beabsichtigt, dieses Verfahren zu starten, und zwar in etwa so:

Intent notificationIntent = new Intent(getActivity(), Abc.class);
notificationIntent.putExtra("menuFragment", "favoritesMenuItem");

und in Ihrer Basisaktivität:

@Override
protected void onCreate(final Bundle savedInstanceState)
{
    String menuFragment = getIntent().getStringExtra("menuFragment");

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    // If menuFragment is defined, then this activity was launched with a fragment selection
    if (menuFragment != null) {

        // Here we can decide what do to -- perhaps load other parameters from the intent extras such as IDs, etc
        if (menuFragment.equals("favoritesMenuItem")) {
            FavoritesFragment favoritesFragment = new FavoritesFragment();
            fragmentTransaction.replace(Android.R.id.content, favoritesFragment);
         }
    } else {
         // Activity was not launched with a menuFragment selected -- continue as if this activity was opened from a launcher (for example)
         StandardFragment standardFragment = new StandardFragment();
         fragmentTransaction.replace(Android.R.id.content, standardFragment);
    }
}
36
Vito
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
             | Intent.FLAG_ACTIVITY_SINGLE_TOP )

Da Ihre Absicht Flags: FLAG_ACTIVITY_SINGLE_TOP gesetzt hat, wird "onCreate ()" nicht aufgerufen, wenn die Aktivität erstellt wurde. Sie sollten stattdessen die Parameter in der Methode "onNewIntent ()" erhalten.

8
gustavo

Willkommen zu 2019 und Navigation Component :)

Wenn Sie die Komponente Navigation verwenden, können Sie ein bestimmtes Ziel mit NavDeepLinkBuilder öffnen:


val pendingIntent = NavDeepLinkBuilder(context)
                     .setComponentName(MainActivity::class.Java)
                     .setGraph(R.navigation.nav_graph)
                     .setDestination(R.id.destination)
                     .setArguments(bundle)
                     .createPendingIntent()

...

notificationBuilder.setContentIntent(pendingIntent)

...

Beachten Sie, dass die Verwendung von setComponentName nur wichtig ist, wenn Ihr Ziel nicht in der Startaktivität enthalten ist.

7
arsent

sie sollten auch . commit (); und ft1.addToBackStack (null); hinzufügen, damit es sich nicht mit dem vorherigen überschneidet und wenn Sie dies nicht hinzufügen, ft1.addToBackStack (null); on back Ihre App wird beendet. Fügen Sie dies entsprechend Ihrer Funktionalität hinzu

String menuFragment = getIntent().getStringExtra("menuFragment");

ft1 = getSupportFragmentManager().beginTransaction();

ft1.addToBackStack(null);

ft1.replace(R.id.frame_container, favoritesFragment).commit();
2
Jishant