Подтвердить что ты не робот

Как открыть страницу фрагмента при нажатии на уведомление в android

Я пытаюсь открыть фрагмент, когда я нажимаю уведомление в панели уведомлений. Моя структура приложения:

  • базовое действие с меню навигационного ящика
  • фрагмент, который открывается из меню

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

Может ли кто-нибудь сказать мне, как связать со следующей страницей фрагмента (настоящий код находится в классе, который расширяет фрагмент)

4b9b3361

Ответ 1

Вам нужно будет начать свою базовую деятельность, как обычно, но добавьте некоторую дополнительную информацию о том, какой фрагмент меню будет открыт. Здесь вы можете увидеть, как это можно сделать: fooobar.com/questions/271906/...

Это зависит от дополнительной информации, которую вы получаете в методе операций "onCreate()", в которой вы будете использовать для запуска/загрузки фрагмента.

Смотрите здесь, например, как работать с фрагментами: http://www.tutorialspoint.com/android/android_fragments.htm http://developer.android.com/guide/components/fragments.html

Намерение запустить эту процедуру будет примерно таким:

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

и в вашей основной деятельности:

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

Ответ 2

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
             | Intent.FLAG_ACTIVITY_SINGLE_TOP )

Как только ваш намеренный набор Flags: FLAG_ACTIVITY_SINGLE_TOP, "onCreate()" не будет вызываться, когда действие было создано, вы должны получить параметры в методе, называемом "onNewIntent()".

Ответ 3

вы также должны добавить .commit(); и ft1.addToBackStack(null);, чтобы он не перекрывался на предыдущем, и если вы не будете объявлять об этом ft1.addToBackStack(нуль); на вашем приложении выйдет, так что добавьте его в соответствии с вашими функциональными возможностями

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

ft1 = getSupportFragmentManager().beginTransaction();

ft1.addToBackStack(null);

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

Ответ 4

Добро пожаловать в 2019 и навигационный компонент :)

Если вы используете Navigation компонент, вы можете открыть определенное место назначения с помощью NavDeepLinkBuilder:


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

...

notificationBuilder.setContentIntent(pendingIntent)

...

Обратите внимание, что важно использовать setComponentName только в том случае, если ваш пункт назначения не setComponentName в программе запуска.