在工具栏上上下按钮,但不使用MVC架构应用程序应用程序棘手的实现



我已经在此stackoverflowapi应用中实现了片段,并且在使用到活动到活动后,我使用了片段。但是,我从工具栏上的UP Buutton转到列表的Initail Fragment的功能。

我以前已经在某种活动中实现了这一点。

现在我紧紧抓住稻草,因为我将所有东西都扔在稻草上,就像onoptionsitemeclectectectectectement retalurount false和Sethasoptionsmenu true这显然无法使用,我离开了,我离开了,为什么我们不能只有一种方法来获得SupportActionBar和SupportActionBar和将其设置为已启用等...显然不是这种情况。

任何帮助,链接,详细说明。


QuestionDetailfragment

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;
    }
}

我将在此处添加仓库

github

预先感谢。

我认为您的问题可能是您在按UP Botton时正在调用mActivity.onBackPressed();onBackPressed默认情况下结束当前Activity。当您将应用程序实施为多个活动时,onBackPressed()杀死了最后一个Activity,但是当您以Fragments实现它时,它现在杀死的杀死比您想要的更多。

我尝试运行您的应用程序,并且在Android 24模拟器上测试时,工具栏中的按钮似乎将我带回主页。我认为这是您最初想要的,因此,如果第一部分没有帮助您,请让我知道您要按钮做什么。

最新更新