web-dev-qa-db-fra.com

Comment ouvrir la page de fragment, lorsque vous appuyez sur une notification dans android

J'essaie d'ouvrir un fragment lorsque j'appuie sur une notification dans la barre de notification. La structure de mon application est:

  • une activité de base avec un menu de tiroir nav
  • un fragment ouvert depuis le menu

    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);
    

Quelqu'un peut-il me dire comment créer un lien avec la page de fragment suivante (le code actuel est dans la classe qui étend le fragment)

Vous devrez commencer votre activité de base comme d'habitude, mais ajoutez des informations supplémentaires à l'intention sur le fragment de menu qui sera ouvert. Ici, vous pouvez voir comment cela peut être fait: https://stackoverflow.com/a/8610916/1652236

Cela dépend des informations supplémentaires que vous récupérez dans la méthode des activités 'onCreate ()' dans laquelle vous utiliserez pour démarrer/charger le fragment.

Voir ici par exemple comment fonctionnent les fragments: http://www.tutorialspoint.com/Android/android_fragments.htmhttp://developer.Android.com/guide/components/fragments .html

Son intention de lancer cette procédure sera quelque chose comme:

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

et dans votre activité de base:

@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 )

Comme votre intention a défini les indicateurs: FLAG_ACTIVITY_SINGLE_TOP, "onCreate ()" ne sera pas appelé lorsque l'activité a été créée, vous devez recevoir les paramètres dans la méthode appelée "onNewIntent ()" à la place.

8
gustavo

Bienvenue dans 2019 et composant de navigation :)

Si vous utilisez Navigation Composant, vous pouvez ouvrir une destination spécifique en utilisant NavDeepLinkBuilder:


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

...

notificationBuilder.setContentIntent(pendingIntent)

...

Veuillez noter qu'il est important d'utiliser setComponentName uniquement si votre destination ne fait pas partie de l'activité du lanceur.

7
arsent

vous devez également ajouter . commit (); et ft1.addToBackStack (null); afin qu'il ne se chevauche pas sur le précédent et si vous ne publiez pas ceci ft1.addToBackStack (null); à l'arrière, votre application se fermera donc ajoutez ceci en fonction de vos fonctionnalités

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

ft1 = getSupportFragmentManager().beginTransaction();

ft1.addToBackStack(null);

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