在Android片段中使用onBackPressed()

DJ-*_*DOO 24 android fragment

我正在研究一个项目,我需要能够使用每个片段中的后退按钮在之前的片段之间导航,我有使用操作栏中的后退箭头编写的方法,但是,我希望能够按下后退按钮使用相同的功能.我不想使用后台堆栈.有没有办法做到这一点?

编辑

我希望能够在用户单击后退按钮时调用返回上面的方法,而不是使用后台堆栈.我需要在片段中使用gobackpressed方法.这可能吗?我希望这清楚而简洁.对上面引起的任何混淆道歉.

回到上一页

public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out);

    ft.show(preFragment);

    //**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK**

    ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag));
    ft.addToBackStack(null);
    ft.commit();

    Misc.currentContentFragmentTag = preFragmentTag;

    createBar(preFragment);
}
Run Code Online (Sandbox Code Playgroud)

直走

public void gotoNextFragment(String nextTag, Fragment nextFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out);

    boolean newlyCreated = false;
    if(nextFragment == null){
        nextFragment = Fragment.instantiate(this, nextTag);
        newlyCreated = true;
    }

    //hide current fragment
    ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag));

    if(newlyCreated){
        ft.add(R.id.content_frame, nextFragment, nextTag);
    }
    else{
        ft.show(nextFragment);
    }

    ft.addToBackStack(null);
    ft.commit();
    Misc.currentContentFragmentTag = nextTag;

    createBar(nextFragment);
}
Run Code Online (Sandbox Code Playgroud)

这些是我来回导航的方式,我希望能够在onBackPressed()上实现go back方法.这有意义吗?

Ioa*_*dze 34

我没有找到关于这个问题的任何好的答案,所以这是我的解决方案.

如果要在每个片段中获取backPress,请执行以下操作.

创建界面 OnBackPressedListener

public interface OnBackPressedListener {
    void onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

希望被通知的每个片段都backPress 实现了这个接口.

在父活动中,您可以覆盖 onBackPressed()

@Override
public void onBackPressed() {
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
    if (fragmentList != null) {
        //TODO: Perform your logic to pass back press here
        for(Fragment fragment : fragmentList){
           if(fragment instanceof OnBackPressedListener){
               ((OnBackPressedListener)fragment).onBackPressed();
           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


tig*_*chi 22

你为什么不想使用后台?如果存在潜在的问题或混淆,我们可以为您清理它.

如果你想坚持你的要求,只需覆盖你的Activity的onBackPressed()方法,并在点击ActionBar中的后退箭头时调用你正在调用的任何方法.

编辑:如何解决"黑屏"片段后栈问题:

您可以通过向片段管理器添加backstack侦听器来解决该问题.该侦听器检查片段后备堆栈是否为空并相应地完成Activity:

您可以在Activity的onCreate方法中设置该侦听器:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentManager fm = getFragmentManager();
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if(getFragmentManager().getBackStackEntryCount() == 0) finish();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)