web-dev-qa-db-ja.com

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

誰でも次のフラグメントページとリンクする方法を教えてもらえますか(現在のコードはフラグメントを拡張するクラスにあります)

通常どおり、基本アクティビティを開始する必要がありますが、開くメニューフラグメントに関する追加情報をインテントに追加します。ここで、それがどのように行われるかを見ることができます: https://stackoverflow.com/a/8610916/1652236

これは、フラグメントの開始/ロードに使用するアクティビティ 'onCreate()'メソッドで取得する追加情報に依存します。

フラグメントの使用方法の例については、こちらをご覧ください: http://www.tutorialspoint.com/Android/android_fragments.htmhttp://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);
    }
}
36
Vito
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
             | Intent.FLAG_ACTIVITY_SINGLE_TOP )

インテントがFlags:FLAG_ACTIVITY_SINGLE_TOPを設定しているため、アクティビティの作成時に "onCreate()"は呼び出されません。代わりに、 "onNewIntent()"というメソッドでパラメーターを受け取る必要があります。

8
gustavo

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を使用することが重要です。

7
arsent

また、。commit();およびft1.addToBackStack(null);を追加して、prevoiusで重複しないようにし、これを広告しない場合ft1.addToBackStack(null);バックでアプリが終了するので、機能に応じてこれを追加します

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

ft1 = getSupportFragmentManager().beginTransaction();

ft1.addToBackStack(null);

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