【问题标题】:Issue with back button in fragment android片段android中的后退按钮问题
【发布时间】:2014-07-24 07:19:06
【问题描述】:

我已经使用片段进行了应用。首先有一个主屏幕,其中有一个登录按钮。当用户单击登录按钮时,会打开一个新片段,其中包含用户名和密码。我已将登录片段放入backstack,以便用户可以导航到主屏幕。如果用户在登录片段中输入正确的凭据,则打开主片段。我还放置了主片段,以便我可以来回导航。但现在我想要的是当用户在主屏幕上,如果他按下后退按钮,应用程序应该关闭,但在我的情况下,它会返回登录片段。

例如 1] 如果用户从主屏幕按下登录按钮

backstack contains "login"

2] 现在,如果用户输入正确的凭据并单击确定,则打开主片段

backstack contains "main"
                   "login"

3] 现在在主片段中我有 2 个按钮说 A 和 B,现在如果用户点击按钮 A

 backstack contains "A"
                    "main"
                     "login"

现在我想要的是,当用户在主片段上单击后退按钮时,应用程序应该完成,但在我的情况下,它会返回登录片段,因为登录仍然存在于后台堆栈中

【问题讨论】:

  • 您是否在未将主片段添加到后台堆栈的情况下尝试了您的问题?
  • 先生,在家里的碎片中,我有几个按钮可以打开另一个碎片,所以有必要把家里的碎片放到后台
  • 您可以从需要关闭所有内容的地方调用 getActivity().finish() 吗?

标签: android fragment


【解决方案1】:

编辑 -

解决方案 1:

@Override
public void onClick(View view) {
    Intent intent = new Intent(view.getContext(), Main.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    getActivity().finish();      
}

注意:

我假设 - Home 类是您当前的主屏幕类,Main 类是您应用程序的主要起点。

使用标志 Intent.FLAG_ACTIVITY_CLEAR_TOP 并从主页调用第一页。

解决方案 2:

如果您只有一个 Activity 可以处理所有片段,那么只需调用,

 @Override
    public void onClick(View view) {
        getActivity().finish();      
    }

【讨论】:

  • 见先生,我已经更新了我的帖子,请看看
  • @user3844417 - 没问题,此解决方案将始终有效。不要忘记使用Intent.FLAG_ACTIVITY_CLEAR_TOP 清除堆栈。这将清除您的后台堆栈。 finish() 将关闭应用程序。
  • 但是先生在哪里使用这个意图代码???我还发现了一些我们可以使用 popfrombackstack 的地方
  • @user3844417 - 在后退按钮单击时使用此代码。 popfrombackstack 是从堆栈中弹出一个片段,但要清除所有片段并退出应用程序,您需要上面的代码。
  • 每个片段都是某些活动的一部分。同样,Mainfrag 是您的某个活动的一部分,因此如果您在该活动中调用它,那么它将被调用。
【解决方案2】:

你必须这样做:

    @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
            && !event.isCanceled()) {

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        startActivity(intent);
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

说是不是你想要的:)

【讨论】:

  • 见先生,我已经更新了我的帖子,请看看
【解决方案3】:

当用户单击后退按钮时,首先您从堆栈中获取条目。如果该条目是您的主要片段,则终止该应用程序。

android.os.Process.killProcess(android.os.Process.myPid()); 完成();

【讨论】:

    【解决方案4】:

    虽然您只有登录片段可见(片段堆栈中只有登录片段),但如果单击后退按钮,那么您希望关闭活动吗?

    解决方案:login片段添加到片段堆栈而不将其添加到backstack(不使用addToBackStack() 方法。)

    例如:

    添加片段而不将其添加到后台堆栈:

    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
    

    添加片段并将其添加到后台堆栈:

    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    

    然而,在调用 commit() 之前,您可能需要调用 addToBackStack(),以便将事务添加到 碎片交易。这个回栈由活动管理,并且 允许用户通过按 后退按钮。

    Read more about fragments.

    【讨论】:

    • OP 还希望在单击后退按钮时来回导航其他片段,这需要在提交之前对每个片段调用 addToBackStack。此解决方案将不提供此导航。
    • 如果我没有错过重点,将“A”和“main”片段(或除“login”之外的其他片段)添加到 backstack 应该适用于 OP。
    • 如果您将少数片段添加到 backstack(与登录片段相反),那么在登录片段上按后退按钮不会导致应用退出,因为其他片段仍然存在于 backstack 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多