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'
对不起,我被搞糊涂了。编辑过了!谢谢