Java 工具栏上的向上按钮存在但不工作MVC架构应用程序实现

Java 工具栏上的向上按钮存在但不工作MVC架构应用程序实现,java,android,android-fragments,model-view-controller,Java,Android,Android Fragments,Model View Controller,我在这个stackoverflowAPI应用程序中实现了片段,在从使用到活动的重构之后,我使用了片段。但是,我已经失去了从工具栏上的向上按钮返回到initail片段的功能,initail片段是一个列表 我以前在一个活动中实现了这一点,并使其正常工作 现在我抓着救命稻草,因为我把所有的东西都扔向它,比如选项项选择返回false并将选项菜单设置为true这显然不起作用,我在想为什么我们不能有一种方法,比如获取supportactionbar并将其设置为enabled等等……显然情况并非如此 非常感谢

我在这个stackoverflowAPI应用程序中实现了片段,在从使用到活动的重构之后,我使用了片段。但是,我已经失去了从工具栏上的向上按钮返回到initail片段的功能,initail片段是一个列表

我以前在一个活动中实现了这一点,并使其正常工作

现在我抓着救命稻草,因为我把所有的东西都扔向它,比如选项项选择返回false并将选项菜单设置为true这显然不起作用,我在想为什么我们不能有一种方法,比如获取supportactionbar并将其设置为enabled等等……显然情况并非如此

非常感谢您的帮助、链接和详细说明


问题摘要

public class QuestionDetailsFragment extends BaseFragment implements QuestionDetailViewMvc.Listener, FetchQuestionDetailsUseCase.Listener, BackPressedListener {

    private static final String ARG_QUESTION_ID = "ARG_QUESTION_ID";

    public static QuestionDetailsFragment newInstance(String questionId) {
        Bundle args = new Bundle();
        args.putString(ARG_QUESTION_ID, questionId);
        QuestionDetailsFragment fragment = new QuestionDetailsFragment();
        fragment.setArguments(args);
        return fragment;
    }

    private FetchQuestionDetailsUseCase mFetchQuestionDetailsUseCase;
    private BackPressDispatcher mBackPressDispatcher;
    private ScreensNavigator mScreensNavigator;
    private ToastHelper mMessagesDisplayer;
    private QuestionDetailViewMvc mViewMvc;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


        setHasOptionsMenu(true);
        mFetchQuestionDetailsUseCase = getCompositionRoot().getFetchQuestionDetailsUseCase();
        mMessagesDisplayer = getCompositionRoot().getToastHelper();

        mBackPressDispatcher = getCompositionRoot().getBackPressDispatcher();
        mViewMvc = getCompositionRoot().getViewMvcFactory().getQuestionDetailViewMvc(container);

        mScreensNavigator = getCompositionRoot().getScreensNavigator();
        return mViewMvc.getRootView();
    }

    @Override
    public void onStart() {
        super.onStart();
        mFetchQuestionDetailsUseCase.registerListener(this);
        mViewMvc.registerListener(this);
        mViewMvc.showProgressIndication();
        mBackPressDispatcher.registerListener(this);

        mFetchQuestionDetailsUseCase.fetchQuestionDetailsAndNotify(getQuestionId());


    }

    @Override
    public void onStop() {
        super.onStop();
        mFetchQuestionDetailsUseCase.unregisterListener(this);
        mViewMvc.unregisterListener(this);

        mBackPressDispatcher.unnregisterListener(this);

    }

    private void bindQuestionDetails(QuestionDetails questionDetails) {
        mViewMvc.hideProgressIndication();
        mViewMvc.bindQuestion(questionDetails);
    }


    private String getQuestionId() {

        return getArguments().getString(ARG_QUESTION_ID);
    }


    @Override
    public void onQuestionDetailsFetched(QuestionDetails questionDetails) {
        bindQuestionDetails(questionDetails);

    }

    @Override
    public void onQuestionDetailsFailed() {
        mViewMvc.hideProgressIndication();
        mMessagesDisplayer.showUseCaseError();
    }


    @Override
    public void onNavigationUPClicked() {

        onBackPressed();
    }

    @Override
    public void onDrawerItemClicked(DrawerItems item) {
        switch (item) {
            case QUESTIIONS_LIST:
                mScreensNavigator.toQuestionsList();
        }
    }

    @Override
    public boolean onBackPressed() {
        if (mViewMvc.isDrawerOpen()) {
            mViewMvc.closeDrawer();
            return true;
        } else {
            return false;
        }
    }
}

ScreenNavigator.java

public class ScreensNavigator {


    private final FragmentManager mFragmentManager;
    private final FragmentFrameWrapper mFragmentFrameWrapper;

    public ScreensNavigator(FragmentManager mFragmentManager, FragmentFrameWrapper fragmentFrameWrapper) {
        this.mFragmentManager = mFragmentManager;
        this.mFragmentFrameWrapper = fragmentFrameWrapper;
    }


    public void toQuestionDetails(String questionId) {
        FragmentTransaction ft = mFragmentManager.beginTransaction();
        ft.addToBackStack(null);
        ft.replace(mFragmentFrameWrapper.getFragmentFrame().getId(), QuestionDetailsFragment.newInstance(questionId)).commit();
    }

    public void toQuestionsList() {
        mFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        FragmentTransaction ft = mFragmentManager.beginTransaction();
        ft.replace(mFragmentFrameWrapper.getFragmentFrame().getId(), QuestionsListtFragment.newInstance()).commit();
    }

    public void navigateUpToList() {

        // here I would like to some help..........................

    }
}
在这个类中,我最初使用的是一个上下文,但在重构到片段之后,它没有任何帮助,所以我删除了它


碱基片段

public class BaseFragment extends Fragment {

    private ControllerCompositionRoot mControllerCompositionRoot;

    protected ControllerCompositionRoot getCompositionRoot() {

        if(mControllerCompositionRoot == null) {

            mControllerCompositionRoot = new ControllerCompositionRoot(
                    ((CustomApplication) requireActivity().getApplication()).getCompositionRoot(),
                    requireActivity()
            );

        }

        return  mControllerCompositionRoot;
    }
}
我也会在这里添加回购协议


提前谢谢。

我想您的问题可能是您正在调用
mActivity.onBackPressed()当您按下向上按钮时<默认情况下,code>onBackPressed
结束当前的
活动。当您将应用程序实现为多个活动时,
onBackPressed()
杀死了最后一个
活动
,但当您将其实现为
片段时,现在杀死的比您希望的多


我试着运行你的应用程序,当我在安卓24模拟器上测试时,工具栏上的按钮似乎会把我带回主页面。我认为这是你最初希望应用程序做的,因此如果第一部分没有帮助你,请让我知道你希望按钮做什么。

是的,问题是让它回到最后一个片段,它只是必须在工具栏MVC中实现这一点,谢谢你是对的。很高兴我能提供帮助!谢谢你的投票和检查。