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