Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段硬件后退按钮事件调用两次_Android_Android Fragments - Fatal编程技术网

Android 片段硬件后退按钮事件调用两次

Android 片段硬件后退按钮事件调用两次,android,android-fragments,Android,Android Fragments,我试图通过按特定顺序调用的片段实现向后导航:A->B->C,通过使用硬件按钮返回,我希望它们保持顺序 我正在使用fragmenttransaction。替换以切换不带addToBackStack的片段,因为它使我的ActionBarMenu行为不正常 问题是,当我在片段Cback按钮上时,会直接返回到A。我发现这是因为click事件执行了两次,我将进入B并直接进入A @Override public void onViewCreated(View view, @Nullable Bundle s

我试图通过按特定顺序调用的片段实现向后导航:
A
->
B
->
C
,通过使用硬件按钮返回,我希望它们保持顺序

我正在使用
fragmenttransaction。替换
以切换不带
addToBackStack
的片段,因为它使我的
ActionBarMenu
行为不正常

问题是,当我在片段
C
back按钮上时,会直接返回到
A
。我发现这是因为
click
事件执行了两次,我将进入
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

有人能告诉我如何避免两次按钮事件吗?

如果您想“吸收”键事件并阻止它向上传播到活动,则返回
true
,该活动有自己的
onBackPressed()
实现

if( keyCode == KeyEvent.KEYCODE_BACK )
{
    goBackToDays();
    return true; // <-- should be TRUE, not FALSE
}
return false;
if(keyCode==KeyEvent.keyCode\u BACK)
{
goBackToDays();
返回true;//您可以做两件事

  • “这让我的ActionBarMenu行为不端。”修复此问题
  • 重写活动上的
    onBackPressed()
    ,找出当前加载的片段并替换为所需的片段

    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
    }
    

  • 重写托管活动中的
    onBackPressed()
    方法。 像这样做

    private void replaceFragment (Fragment fragment){
      String backStateName = fragment.getClass().getName();
    
      FragmentManager manager = getSupportFragmentManager();
      boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
    
      if (!fragmentPopped){ //fragment not in back stack, create it.
         FragmentTransaction ft = manager.beginTransaction();
         ft.replace(R.id.content_frame, fragment);
         ft.addToBackStack(backStateName);
         ft.commit();
      }
    }
    .
    
    .
    
    @Override
    public void onBackPressed(){
      if (getSupportFragmentManager().getBackStackEntryCount() == 1){
        finish();
      }
      else {
        super.onBackPressed();
      }
    }
    
    这是一个解释得很好的答案。

    我认为“click event执行两次”,因为您同时调用了事件ACTION\u DOWN和ACTION\u 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;
        }
    
    2件事:

  • 即使您正在替换
  • 片段,旧的
    OnKeyListener
    仍会保留在那里(稍后会被激活)。尝试在切换片段时删除旧的OnKeyListener
  • 正如所指出的,您需要清楚地记住,有两个操作与关键事件相关(
    KeyEvent.ACTION\u DOWN
    KeyEvent.ACTION\u UP

  • 你能在github上发布一个项目的基本设置吗?语法错误:
    Operator'=='不能应用于'android.view.KeyEvent','int'
    对不起,我被搞糊涂了。编辑过了!谢谢