Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Fragment onBackPressed display alertDialog_Android_Fragment_Back Stack_Onbackpressed - Fatal编程技术网

Android Fragment onBackPressed display alertDialog

Android Fragment onBackPressed display alertDialog,android,fragment,back-stack,onbackpressed,Android,Fragment,Back Stack,Onbackpressed,我目前正在使用带有backbackback的Fragment。 在一个片段中,例如“菜单”,当用户点击后退按钮时,我想提示一个alertdialog。但我在实现这一点上遇到了一些问题。我在下面列出了两个我尝试过的场景 场景1: 我在“菜单”片段中添加了一个KeyListener,当用户点击后退按钮时会触发它 我在“菜单”顶部添加了另一个片段,称为“报告”。当我按下“Report”片段中的back按钮时,它仍然会提示“Menu”片段中使用的alertDialog。 keyListener在后台仍处

我目前正在使用带有backbackback的Fragment。 在一个片段中,例如“菜单”,当用户点击后退按钮时,我想提示一个alertdialog。但我在实现这一点上遇到了一些问题。我在下面列出了两个我尝试过的场景

场景1:

我在“菜单”片段中添加了一个KeyListener,当用户点击后退按钮时会触发它

我在“菜单”顶部添加了另一个片段,称为“报告”。当我按下“Report”片段中的back按钮时,它仍然会提示“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方法。这将在“菜单”片段中提示一个alertDialog。但是,当它提示发出alertDialog时,该片段将自动结束,尽管用户尚未选择alertDialog的任何选项。这可能是由于以下代码导致的:
getFragmentManager()。但我无法删除此代码,因为我需要它来处理其他片段

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();
}
再一次,我只想在“菜单”片段上提示alertDialog,而不会对其他片段产生任何影响。
请提供有关此方法的建议。如果需要任何其他信息,请务必告诉我。

我已使用以下代码解决了此问题。 将keyListener设置为onResume,并在切换到其他片段时删除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);

请看一看我提供的解决方案,你能解释一下这个“//删除KeyListener。在更改为其他片段时实现它吗?”?