后退按钮按下处理程序

Back Button pressed handler

我正在开发一个需要 Navigation Drawer. 这个应用程序有 1 个 MainActivity 和大约 10 个片段。当我单击 MainActivity 中的导航抽屉图标时,它将显示 10 fragments,因此我可以 select 每个。

我选择fragmentA,然后是B,然后是C...到F,例如。当我在 fragment F 并按下后退按钮时,它将带我回到 fragment E,然后再次返回它将带我到 fragment D... 我需要的是当我在 fragment 中按下后退按钮时,它需要转到 navigationdrawer 中的默认主页。

我在 SO 上搜索并找到了 1 个类似的问题,但还没有答案,所以我必须提出另一个问题

你试过了吗

try {  
   activity.getSupportFragmentManager().popBackStackImmediate(n‌​ull,FragmentManager.POP_BACK_STACK_INCLUSIVE);
   } catch (IllegalStateException e)
  { 
     e.printStackTrace();
  }

在这种情况下,不要将您的 Fragments 添加到 backStack。如果您不想在 onBackPressed() 上弹出,只需替换每个 fragment

getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, new AFragment()).commit();

句柄 onBackPressed() :

@Override
public void onBackPressed() {
    Fragment frag = getSupportFragmentManager().findFragmentById(R.id.containerFrame);
    if (frag instanceof HomeFragment) {
        // DO Onbackpress
        finish();
    } else {
        HomeFragment fragment = new HomeFragment()
        getSupportFragmentManager().beginTransaction().replace(R.id.containerFrame, fragment).commit();
    }
}

在你的清单中试试这个 我想这会对你有帮助 >

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Frame1"
            android:label="@string/frame_1"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.webservice.appname.MainActivity" />
        </activity>
        <activity
            android:name=".Frame2"
            android:label="@string/frame_2"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.webservice.appname.MainActivity" />
        </activity>
        <activity
            android:name=".Frame3"
            android:label="@string/frame_3"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.webservice.appname.MainActivity" />
        </activity>
        .
        .
        .
        .
        .
</application>

我想你可以试试这个。在 onBackPressed()

中添加
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount(); i++) {
            getSupportFragmentManager().popBackStack();
        }
    } else {
        super.onBackPressed();

    }

您好,下面是我的解决方案,

我正在使用以下代码更改片段:

fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();

if (fragmentA == null)
    fragmentA = new FragmentA();

fragmentTransaction.replace(R.id.container, fragmentA);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();

如果您使用的是 supportFragment,则使用 getSupportFragmentManager() 代替 getFragmentManager()。

并且当你执行 backpress 时将下面的代码放入你的 Activity 中,其中包含 Fragment。

@Override
public void onBackPressed() {
    super.onBackPressed();
    getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

希望这个回答对您有所帮助,解决您的问题。

* The purpose of this method is set The current display ui
 *
 * @param id the ui that has to be displayed
 */
public void setDisplay(int id) {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(GravityCompat.START);
    }

    HideKeyboard.hideKeyboard(HomepageActivity.this);
    Intent intent;
    switch (id) {
        //Open up home fragment
        case AppConstants.DISPLAY_HOME:
            if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
                mFragment = new FragmentHome();
                replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
            }
            break;
        //opens up the setting section
        case AppConstants.DISPLAY_SETTING:
            if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentSetting)) {
                mFragment = new FragmentSetting();
                replaceFragment(mFragment, AppConstants.SETTING_FRAGMENT);
            }
            break;
        //display the logout dialog
        case AppConstants.DISPLAY_LOGOUT:
            DialogManager.getInstance().showLogOutLogOut(this);
            break;
        //display the notification section
        case AppConstants.DISPLAY_NOTIFICATION:
            if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentNotification)) {
                mFragment = new FragmentNotification();
                replaceFragment(mFragment, AppConstants.NOTIFICATION_FRAGMENT);
            }
            break;

        default:
            //Setup Home Fragment as default fragment
            if (!(mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome)) {
                mFragment = new FragmentHome();
                replaceFragment(mFragment, AppConstants.HOME_FRAGMENT);
            }
            break;
    }
}

/* * 通过替换任何现有的 mFragment 来插入 mFragment * * @param fragment 需要替换的片段 * @param name 片段的标签 */

public void replaceFragment(final Fragment fragment, final String name) {
          if(mFragmentManager.findFragmentById(R.id.fragment_container)instanceof FragmentHome) {
                mFragmentManager.beginTransaction()
                        .replace(R.id.fragment_container, fragment, name)
                        .addToBackStack(name)
                        .commit();
            } else {
                mFragmentManager.beginTransaction()
                        .replace(R.id.fragment_container, fragment).
                        commit();
            }
      }

/** * 该方法的作用是从栈中移除片段 */ public void removeFragmentFromStack() {

    if (mFragmentManager.findFragmentById(R.id.fragment_container) instanceof FragmentHome) {
        exitFromApp();
    } else {
        mFragmentManager.popBackStackImmediate();

    }
}

试试下面的代码,它对我有用。

    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) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {

                     final Intent startIntent = new Intent(context, MainActivity.class);
                     startIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                     startActivity(startIntent);
                     getActivity().finish();

            }
            }
            return false;
        }
    });
    return rootView;