Android的碎片onBack pressed显示alertDialog [英] Android Fragment onBackPressed display alertDialog

查看:537
本文介绍了Android的碎片onBack pressed显示alertDialog的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前使用的片段与Backstack。
在片段例如之一的菜单的我想,当用户在后退按钮轻拍提示的alertdialog。但我有实现这一一些问题。我列举如下,我尝试了两种场景。

I'm currently using Fragment with Backstack. In one of the fragment e.g "Menu" I wanted to prompt an alertdialog when user tapped on back button. But I'm having some problems in achieving that. I listed two scenario below that I tried.

方案1:

我添加了一个的的KeyListener 的在菜单的片段,当用户在后退按钮拍了拍将触发。

I added a KeyListener in the "Menu" fragment that will trigger when user tapped on back button.

我添加另一个片段之上菜单的所谓的报告的。当我pressed回按钮报告的分段仍会提示出应用于的菜单的片段alertDialog。
所述的KeyListener仍然在背景活性。

I add another fragment on top of "Menu" called "Report". When I pressed back button in "Report" fragment it will still prompt out the alertDialog that used in "Menu" fragment. The keyListener is still active in the background.

菜单片段

    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:

使用的 onBack pressed 的上的 MainActivity 的类方法。这将提示出在alertDialog的菜单的片段。但它提示出alertDialog的那一刻,这个片段将自动结束,尽管用户仍然没有选择alertDialog任何选项。这可能由于这种code getFragmentManager()addOnBackStackChangedListener(getListener()); 。但我不能删除此code作为我需要它的其他片段。

Use onBackPressed method on the MainActivity class. This will prompt out an alertDialog in "Menu" fragment. But the moment it prompts out the alertDialog, this fragment will automatically end despite the user is still yet to select any option of the alertDialog. This may due to this code getFragmentManager().addOnBackStackChangedListener(getListener());. But I can't remove this code as I need it for other fragments.

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并没有对其他任何碎片的影响。
请不要对这种方法的建议。如果有需要的任何其他信息,请不要让我知道。

Once again, I wanted to prompt an alertDialog only at "Menu" fragment and do not have any affect on other fragment. Please do advice regarding on this method. If there is any other information needed please do let me know.

推荐答案

我已经解决了以下code这个问题。
在onResume切换到其他片段时,设置的KeyListener和删除的KeyListener。

I have solved this issue with the following code. Set keyListener at onResume and remove the keylistener when switching to other fragment.

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

这篇关于Android的碎片onBack pressed显示alertDialog的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆