Как открыть страницу фрагмента при нажатии на уведомление в 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);
Может ли кто-нибудь сказать мне, как связать со следующей страницей фрагмента (настоящий код находится в классе, который расширяет фрагмент)
Ответы
Ответ 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
в программе запуска.