如何在fragment中实现onBackPressed并到达HomeFragment?

How to implement onBackPressed in fragment and reach HomeFragment?

我正在使用 3 个片段(HomeFragment、RegisterFragment 和 NewsFragment)。当我单击“后退”按钮时,如何从 NewsFragment 移动到直接 HomeFragment。当我点击后退按钮时,我不想移动到其他片段。

在 NewsFragment 中:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        onBackPressed();
        return true; 
    }
    return super.onKeyDown(keyCode, event);
}


@Override
public void onBackPressed() {
   HomeFragment f = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_home);
   FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
   ft.show(f);
}

您可能有一个 Activity 处理所有这些片段替换。在这个Activity中,如果你用实际显示的片段定义一个变量,你可以覆盖onBackPressed并检查它是否显示NewsFragment并将其替换为HomeFragment。

@Override
public void onBackPressed() {
    if(actualFragment instanceof NewsFragment) {
        HomeFragment homeFragment = new HomeFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, homeFragment);
        transaction.commit();
    }
}

当我按下 return 按钮时,这对我有效!

我不知道你的 fragment 结构,但我使用单个 layout 并将其替换为相应的 fragment.

这是我的代码:

@Override
    //Pressed return button - returns to the results menu
    public void onResume() {
        super.onResume();
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                    frag_name frag_name = new frag_name();
                    FragmentManager manager = getActivity().getSupportFragmentManager();
                    manager.beginTransaction().replace(R.id.yourlayout, frag_name, frag_name.getTag()).commit();
                   return true;
                }
                return false;
            }
        });
    }

我制作了一个实用程序 class 来控制我的片段导航。

这是 class 的样子:

public class FragmentController {

    private static final String TAG = FragmentController.class.getCanonicalName();
    private static FragmentController mInstance;
    private ArrayList<BaseFragment> mFragmentsList;
    private BaseActivity mActivity;
    private FrameLayout mFragmentContainer;

    public FragmentController(BaseActivity activity) {
        set(activity);
    }

    public static FragmentController getInstance(BaseActivity activity) {
        if (mInstance == null)
            mInstance = new FragmentController(activity);
        return mInstance;
    }

    public static void setInstance(FragmentController mInstance) {
        FragmentController.mInstance = mInstance;
    }

    public void set(BaseActivity activity) {
        mActivity = activity;
        if (mActivity instanceof MainActivity) {
            mFragmentContainer = ((MainActivity) mActivity).getFragmentContainer();
        }
        mFragmentsList = new ArrayList<>();
    }

    public void addFirstFragment(BaseFragment fragment) {
        mFragmentsList.add(fragment);
    }

    public void presentFragment(BaseFragment fragment, boolean removeAllFromBackstack) {
        try {
            Log.d(TAG, "presentFragment: " + fragment.getTagFm());
            if (mActivity.getCurrentFocus() != null) {
                ViewUtils.hideKeyboard(mActivity.getCurrentFocus());
            }
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
            ft.replace(mFragmentContainer.getId(), fragment, fragment.getTagFm());
            ft.addToBackStack(fragment.getTagFm());
            ft.commitAllowingStateLoss();
            if (mFragmentsList.size() != 0)
                if (removeAllFromBackstack) {
                    if (mFragmentsList.size() == 2) {
                        mFragmentsList.remove(1);
                    } else if (mFragmentsList.size() > 2) {
                        mFragmentsList.subList(1, mFragmentsList.size()).clear();
                    }
                }
            if (!isFragmentPresent(fragment))
                mFragmentsList.add(fragment);
        } catch (Exception e) {
            e.printStackTrace();


 }
}

public void removeSecondFragment() {
    mFragmentsList.remove(1);
}

private boolean isFragmentPresent(BaseFragment fragment) {
    for (BaseFragment baseFragment : mFragmentsList) {
        if (baseFragment.getTagFm().equals(fragment.getTagFm()))
            return true;
    }
    return false;
}

public BaseFragment getCurrentFragment() {
    return mFragmentsList.get(mFragmentsList.size() - 1);
}

public ArrayList<BaseFragment> getFragmentsList() {
    return mFragmentsList;
}

}

现在,我在 Activity

中实例化此 class
mFragmentController = FragmentController.getInstance(this);

现在,我 onBackPressed() 从我的 Activity

@Override
public void onBackPressed() {
    if (mFragmentController.getFragmentsList().size() == 1) {
        finish();
    } 
    else {
        mFragmentController.getFragmentsList().remove(mFragmentController.getFragmentsList().size() - 1);
        mFragmentController.presentFragment(mFragmentController.getFragmentsList().get(mFragmentController.getFragmentsList().size() - 1), false);
    }
}

FragmentController class 中,您将看到我在 BaseFragment class 上使用方法 getTagFm()。这基本上是为了识别 que 中存在哪些片段,哪些不存在。 BaseFragment class 会是这样的:

public class BaseFragment extends Fragment {

 public String getTagFm() {
        if (this.getClass().getSimpleName().equals(LoginFragment.class.getSimpleName())) {
            return Constants.TAG_FRAGMENT_LOGIN;
        } else if (this.getClass().getSimpleName().equals(OrderFragment.class.getSimpleName())) {
            return Constants.TAG_FRAGMENT_ORDER;
        } else if (this.getClass().getSimpleName().equals(ProgramFragment.class.getSimpleName())) {
            return Constants.TAG_FRAGMENT_PROGRAM;
        } 
        return Constants.TAG_FRAGMENT_ORDER;
    }

}

其中所有这些片段(LoginFragmentOrderFragmentProgramFragment)扩展 BaseFragment

希望这对某人有所帮助。

与其在后按时检查每个片段,不如维护一个堆栈来跟踪视图层次结构中的每个片段。

    Stack<Fragment> fragmentStack= new Stack<Fragment>();
    // add first fragment
    FragmentManager  fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.add(R.id.container, "your fragment object");
    //push it in stack
    fragmentStack.push(homeListFragment);
    ft.commit();

// add second fragment
ResultListFragment resultListFragment = new ResultListFragment();
    ft.add(R.id.container, resultListFragment);
    fragmentStack.lastElement().onPause();
    ft.hide(fragmentStack.lastElement());
    fragmentStack.push(resultListFragment);
    ft.commit();

//now back button press logic
@Override
public void onBackPressed() {

    if (fragmentStack.size() == 2) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        fragmentStack.lastElement().onPause();
        ft.remove(fragmentStack.pop());
        fragmentStack.lastElement().onResume();
        ft.show(fragmentStack.lastElement());
        ft.commit();
    } else {
        super.onBackPressed();
    }
}