Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 应用程序退出导航抽屉内的片段内的预定按钮大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当我尝试从子片段移动到父片段时,我的应用程序退出(它不会崩溃).Hhere LandingActivity. java是我调用片段ChAnnelGrid.java的主要活动,它调用片段GridMain.java.当我按下后退按钮时片段中的移动设备GridMain应用程序退出而不是移动到ChAnnelGrid.java.I已经添加了addToBACkStack(“tag”)到片段并尝试使用onKey()..我在不同设备上测试了我的应用程序..我检查了其他解决方案有同样的问题并尝试过但没有任何作用..

Navigation Drawer-LandingActivity.java-ChaanelGrid.java(Fragment)-GridMain.java(Fragment)

LandingActivity.java

currentFragment = new ChaanelGrid();

                currentFragment.setArguments(args);
                frgManager = getFragmentManager();

                frgManager.begintransaction().add(R.id.content_frame,currentFragment).addToBACkStack("tag")
                        .commit();

ChaanelGrid.java

Fragment currentFragment = new GridMain();



                    FragmentManager frgManager;
                    frgManager = getFragmentManager();
                    frgManager.begintransaction().add(R.id.content_frame,currentFragment).addToBACkStack("GridMain")
                            .commit()

GridMain.java(我试过没有onKey()方法但也没用)

rootView.setOnKeyListener(new View.onKeyListener() {


   @Override
        public Boolean onKey(View v,int keyCode,KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK)
            {
                Fragment currentFragment = new ChaanelGrid();


                FragmentManager frgManager;
                frgManager = getFragmentManager();
                frgManager.begintransaction().replace(R.id.content_frame,currentFragment)
                        .commit();
                return true;
            }

logcat详细

10-31 21:46:57.954  24452-24452/D/ActivityThread﹕ ACT-AM_ON_PAUSE_CALLED ActivityRecord{41eb8b98 token=android.os.binderProxy@41bb9828 {xyz/xyz..activity.LandingActivity_}}
10-31 21:46:57.971  24452-24452/ D/ActivityThread﹕ ACT-PAUSE_ACTIVITY_FINISHING handled : 0 / android.os.binderProxy@41bb9828
10-31 21:46:58.007  24452-24452/ V/InputMethodManager﹕ focusOut: android.widget.GridView@41f06f40 mServedView=android.widget.GridView@41f06f40 winFocus=false
10-31 21:46:58.297  24452-24452/ I/SurfaCETextureClient﹕ [0x5143bc58] frames:44,duration:1.002000,fps:43.883736
10-31 21:46:58.350  24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.432  24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.753  24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.754  24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 0)
10-31 21:46:58.755  24452-24452/ D/OpenGLRenderer﹕ Flushing caches (mode 2)
10-31 21:46:58.879  24452-24452/ D/ActivityThread﹕ ACT-DESTROY_ACTIVITY handled : 1 / android.os.binderProxy@41bb9828

我尝试在LandingActivity.java中添加以下内容

@Override

public void onBACkPressed() {
    FragmentManager frgManager;
    frgManager = getFragmentManager();

    Fragment fragment = fragmentManager.findFragmentByTag("GridMain");
    if (fragment != null) {
        GridMain gridMain = (GridMain) fragment;
        if (!gridMain.onBACkPressed()) {
            super.onBACkPressed();
        }
    }
    else {
        super.onBACkPressed();
    }
}

并在GridMain.java中跟随

protected Boolean onBACkPressed() {
        FragmentManager frgManager;
        frgManager = getFragmentManager();
        frgManager.popBACkStack();
        return true;
    }

使用Log我检查了LandingActivity.java的onBACkPressed(),但仍然是相同的输出..

解决方法

这就是我通常处理后退按钮的方式:

// "State Machine" variables: to inDicate which is the active Fragment.
private static Boolean isHelpShown = false;
protected static Boolean isInfoShown = false;
protected static Boolean ismainShown = false;
private static Boolean isViewShown = false;

// Used to switch between Fragments.
private static enum Fragments
{
    MAIN,VIEW,HelP,INFO
}

@Override
public final void onBACkPressed()
{
    if (ismainShown)
    {
        // We're in the MAIN Fragment.
        finish();
    }
    else
    {
        // We're somewhere else,reload the MAIN Fragment.
        showFragment(Fragments.MAIN);
    }
}

private final void showFragment(final Fragments FragmentTypE)
{
    isViewShown = false;
    isHelpShown = false;
    isInfoShown = false;
    ismainShown = false;

    final Fragmenttransaction ft =
        getSupportFragmentManager().begintransaction();

    /*
    replace whatever is in the fragment_container view with this
    fragment,and add the transaction to the BACk stack so the user can
    navigate BACk.
    */
    switch(FragmentTypE)
    {
        case HelP:
        {
            ft.replace(R.id.frgMaster,new FRG_Help());
            isHelpShown = true;
            break;
        }
        case INFO:
        {
            ft.replace(R.id.frgMaster,new FRG_Info());
            isInfoShown = true;
            break;
        }
        case VIEW:
        {
            ft.replace(R.id.frgMaster,new FRG_View());
            isViewShown = true;
            break;
        }
        case MAIN:
        {
            ft.replace(R.id.frgMaster,new FRG_Main());
            ismainShown = true;
            break;
        }
    }

    ft.setTransition(Fragmenttransaction.TRANSIT_FRAGMENT_OPEN);

    // Finalize the transaction...
    ft.commit();

    getSupportFragmentManager().executePendingtransactions();
}

正如你所看到的,根据我的需要,我只处理MAIN片段(我退出)或者当我们不在时(我回到MAIN片段:另一个BACk press并退出).

您可以在onBACkPressed方法添加更多检查,以检查您是否在另一个片段中并相应地加载另一个片段.

大佬总结

以上是大佬教程为你收集整理的android – 应用程序退出导航抽屉内的片段内的预定按钮全部内容,希望文章能够帮你解决android – 应用程序退出导航抽屉内的片段内的预定按钮所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。