当前位置: 首页 > 知识库问答 >
问题:

已调用两次Fragment hardware back button事件

康恩
2023-03-14

我试图通过按特定顺序调用的片段实现反向导航:A-

我使用fragmenttransaction.replace为了切换没有addToBackStack的片段,因为它使我的ActionBarMenu行为不端。

问题是当我在片段C返回按钮直接返回A。我发现这是因为单击事件执行了两次我要去B并直接去A

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setOnBackButtonPresed();
}

private void setOnBackButtonPresed() {
    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener( new View.OnKeyListener()
    {
        @Override
        public boolean onKey( View v, int keyCode, KeyEvent event )
        {
            if( keyCode == KeyEvent.KEYCODE_BACK )
            {
                goBackToDays();
                return false;
            }
            return false;
        }
    } );
}

private void goBackToDays() {
    Log.e("fragmentC", "executing on back action")
}

logcat结果:

03-15 08:37:17.353 21245-21245/com.test E/fragmentC: executing on back action
03-15 08:37:17.390 21245-21245/com.test E/fragmentC: executing on back action

谁能给我一个提示,我怎样才能避免两次按键事件?


共有3个答案

竺鸿骞
2023-03-14

你可以做两件事

>

  • "它使我的ActionBarMenu行为不端。"修复此问题。
  • 覆盖您的活动上的onBackPree()并找出您当前加载的片段并替换为您想要的片段。

    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.your_view_container);
    if (fragment instanceof FragmentThree) {
          //replace with your fragment ie. FragmentTwo
    } else if (fragment instanceof FragmentTwo) {
          //replace with your fragment ie. FragmentOne
    }
    

  • 苍德寿
    2023-03-14

    2件事:

    1. 即使您正在替换片段,旧的onkeylister仍会留在那里(稍后会启动get)。尝试在切换片段时删除旧的OnKeyListener
    2. 正如S-lightning指出的那样,您需要牢记有两个操作与关键事件相关(KeyEvent.ACTION\u DOWN和KeyEvent.ACTION\u UP)

    欧阳声
    2023-03-14

    我认为“单击事件执行两次”,因为您将事件ACTION_DOWN和ACTION_UP都称为

    @Override
        public boolean onKey( View v, int keyCode, KeyEvent event )
        {
            if( keyCode == KeyEvent.KEYCODE_BACK && event.getAction()== KeyEvent.ACTION_DOWN)
            {
                goBackToDays();
                return false;
            }
            return false;
        }
    
     类似资料:
    • 问题内容: 为什么在组合框中选择项目时会两次调用此事件? 问题答案: 对于一次更改,JComoboBox ItemListener确实会被调用两次。一次用于SELECTED事件,一次用于DESELECTED事件。 有关如何编写ItemListener的信息,请参见本教程页面。 基本上你要做的就是

    • 在我的应用程序中,我将TextWatcher放在EditText上。当我更改EditText的文本时,TextWatcher的事件会被调用两次。 我正在使用模拟器来运行应用程序。

    • 我有一个自定义钩子,它返回一个动作。父组件“容器”使用自定义钩子并将动作作为道具传递给子组件。 从子组件执行操作时,实际分派发生两次。现在,如果子级直接使用钩子并调用操作,则调度只发生一次。 如何复制它: 打开下面的沙盒,打开chrome上的devool,这样你就可以看到我添加的控制台日志。 https://codesandbox.io/s/j299ww3lo5?fontsize=14 主要的js

    • 我觉得有一个简单的解决办法,但由于某些原因,我不能把我的头围绕它。 我有一个情况,一个按钮必须先点击,才能点击另一个。用户为这2个JButtons选择的选项将决定程序的下一步。这意味着我必须调用actionListener两次,对吗?我如何在一个actionPerformed方法中做到这一点? 如果actionPerformed方法中的(e.getSource()==Square[1][4]&&e

    • 问题内容: 我在Go中关注一个简单的Web服务器示例。 我插入了一条语句,使生成的代码如下所示: 问题是,每当我在Web浏览器中加载端口8000时,此函数就会被调用两次。这是一个问题,因为我打算在每次页面访问时增加一个计数器。通过这种行为,计数器将增加两次。OTOH,如果我这样做,它只会被调用一次。 我觉得我在这里失踪真的很愚蠢。 问题答案: 只需记录请求。您将意识到您的浏览器还请求/favico

    • 我仍在尝试将RXJava2用于多个订阅者使用的轮询服务。它工作得很好,除了它总是调用两次。 我尝试使用publish(1)、take(1)、share()、refCount()等,但结果总是一样。叫两次或多次。 我还是不明白为什么它叫了两次。新订阅服务器应该接收最新发出的值,并且只在更改后的值(如果hashmap更改了)返回为modified List。 我的民意调查可观察到(单例) 我的谓词用于