【问题标题】:Back Button pressed handler后退按钮按下处理程序
【发布时间】:2017-12-12 09:46:13
【问题描述】:

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

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

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

【问题讨论】:

  • 你试过了吗? try { activity.getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } catch (IllegalStateException e) { e.printStackTrace(); }
  • 您正在添加片段,这就是它被添加到后台堆栈的原因。只需替换每个片段,这样当您按下返回时,您将转到导航抽屉。 :stackoverflow.com/questions/18634207/…
  • 分享你的相关代码。

标签: android android-fragments fragment-backstack


【解决方案1】:

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

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

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()。

当您当时执行回压时,将以下代码放入包含 Fragment 的您的 Activity 中。

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

希望这个答案能帮助您并解决您的问题。

【讨论】:

    【解决方案2】:

    我想你可以试试这个。将此添加到onBackPressed()

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

    【讨论】:

      【解决方案3】:

      你试过了吗

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

      【讨论】:

        【解决方案4】:

        在这种情况下,请勿将您的 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();
            }
        }
        

        【讨论】:

          【解决方案5】:
          * 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();
                      }
                }
          

          /** * 此方法的目的是从堆栈中移除片段 */ 公共无效 removeFragmentFromStack() {

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

          【讨论】:

            【解决方案6】:

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

                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;
            

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 当您从任何片段中回调按钮时,它将带您进入主界面
              • 您不需要也永远不需要将片段添加到清单中。您在上面声明的清单清楚地表明您有活动而不是片段。
              猜你喜欢
              • 2011-07-12
              • 2016-10-26
              • 1970-01-01
              • 1970-01-01
              • 2013-04-22
              • 1970-01-01
              • 1970-01-01
              • 2016-02-07
              • 2014-01-02
              相关资源
              最近更新 更多