1

私は現在、バックスタックでフラグメントを使用しています。「メニュー」などのフラグメントの1つでは、ユーザーが戻るボタンをタップしたときにアラートダイアログを表示したいと考えていました。しかし、私はそれを達成するためにいくつかの問題を抱えています。以下に、私が試した2つのシナリオをリストしました。

シナリオ 1:

ユーザーが戻るボタンをタップしたときにトリガーされる" Menu " フラグメントにKeyListenerを追加しました。

「 Menu」の上に「Report 」という別のフラグメントを追加します。「 Report 」フラグメントで戻るボタンを押しても、「 Menu 」フラグメントで使用されている alertDialog が引き続き表示されます。keyListener はバックグラウンドでまだアクティブです。

メニューフラグメント

    rootView.setFocusableInTouchMode(true);
    rootView.requestFocus();
    rootView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction()!=KeyEvent.ACTION_DOWN)
                    return true;

                    switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK : 
                        Log.i("Menu", "onKey Back listener is working!!!");
                        new AlertDialog.Builder(getActivity())
                        .setTitle("Information")
                        .setMessage("Do you wish to exit from Menu Screen?")
                        .setNegativeButton("No", null)
                        .setPositiveButton("Yes",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int id) {

                                        ((MainActivity)getActivity()).selectItem(0, true);
                                    }
                                }).create().show();
                        break;
                    }

                   return true;
            }
        });

シナリオ 2:

MainActivityクラスでonBackPressedメソッドを使用します。これにより、" Menu " フラグメントで alertDialog が表示されます。ただし、alertDialog が表示された瞬間に、ユーザーがまだ alertDialog のオプションを選択していなくても、このフラグメントは自動的に終了します。これは、このコードが原因である可能性があります。しかし、他のフラグメントに必要なため、このコードを削除することはできません。getFragmentManager().addOnBackStackChangedListener(getListener());

MainActivity.class

@Override
public void onBackPressed() {
    FragmentManager manager = getFragmentManager();
    if (manager != null) {
        int backStackEntryCount = manager.getBackStackEntryCount();
        Log.i(TAG, "backstackcount :"+backStackEntryCount);
        FragmentManager fragmentManager = getFragmentManager();

        if(getFragmentManager().getBackStackEntryCount()-1 >=0){
            Fragment currentFragment = fragmentManager
                    .findFragmentByTag(fragmentManager.getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName());
            Log.i(TAG, "class: "+currentFragment.getClass());
            Log.i(TAG, "backstackCount: "+backStackEntryCount);

            globalCurrentFragment = currentFragment;

            if(currentFragment.getClass() == Master_Menu.class){
                Log.i("currentFragment", "getClass = true");

                    new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Information")
                    .setMessage("Do you wish to exit from Master Account session?")
                    .setNegativeButton("No", null)
                    .setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int id) {

                                    if (globalCurrentFragment != null) {
                                        globalCurrentFragment.onResume();
                                    }
                                }
                            }).create().show();

            }
            else{
                if (globalCurrentFragment != null) {
                    globalCurrentFragment.onResume();
                }
            }

            //if offer list

        }else{
            globalCurrentFragment = null;
            selectItem(0, false);
        }

    }
    super.onBackPressed();
}

繰り返しますが、「Menu」フラグメントでのみ alertDialog を促し、他のフラグメントには影響を与えないようにしたいと考えました。この方法についてアドバイスをお願いします。他に必要な情報がある場合は、お知らせください。

4

1 に答える 1

0

次のコードでこの問題を解決しました。onResume で keyListener を設定し、他のフラグメントに切り替えるときに keylistener を削除します。

public void setKeyListenerOnView(View v){

    Log.i(TAG, "setKeyListenerOnView");

    v.setFocusableInTouchMode(true);
    v.requestFocus();
    v.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction()!=KeyEvent.ACTION_DOWN)
                    return true;

                    switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK : 
                        Log.i("Menu", "onKey Back listener is working!!!");
                        new AlertDialog.Builder(getActivity())
                        .setTitle("Information")
                        .setMessage("Do you wish to exit from Master Account session?")
                        .setNegativeButton("No", null)
                        .setPositiveButton("Yes",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int id) {

                                        ((NavigationDrawer)getActivity()).selectItem(0, true);
                                    }
                                }).create().show();
                        break;
                    }

                   return true;
            }
        });
}

@Override
public void onResume() {
    super.onResume();
    Log.i(TAG, "onResume");
    setKeyListenerOnView(getView());
}


//Remove KeyListener. Implement this when changing to other fragment.
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
rootView.setOnKeyListener(null);
于 2014-11-21T07:03:54.287 に答える