繁体   English   中英

片段返回导航退出到主屏幕-Android

[英]Fragment Back Navigation Exiting to Home Screen - Android

我在一个活动中有一个片段,可以使用FragmentManager和FragmentTransaction启动该片段,但是当我尝试通过“后退”按钮导航回到“活动”时,应用程序退出。

这是我在Activity类中的片段创建和交易:

DetailFragment df = new DetailFragment();

try {
    df.initFragment(jsonObject);
} catch (Exception e) {
    e.printStackTrace();
}

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, df);
fragmentTransaction.addToBackStack(null);

fragmentTransaction.commit();

我也重写onBackPressed()

@Override
public void onBackPressed() {
    super.onBackPressed();
}

通过上述设置,按一下“后退”按钮将返回主屏幕。


我还尝试修改onBackPressed()来执行以下操作:

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
    } else {
        super.onBackPressed();  
    }
}

在onBackPressed()的第二个版本中,需要2次后退操作才能返回到主屏幕。 请记住,我正在尝试返回原始活动。

有什么建议么?

PS我可以根据需要添加片段代码

您的第二个版本的onBackPressed()需要2次后按才能返回到主屏幕。 因此,似乎fm.popBackStack()正在被调用。 尝试将其替换为popBackStackImmediate()

编辑:创建片段时,请尝试使用以下内容代替.replace

fragmentTransaction.add(R.id.fragment_container, df);

如果仍然无法解决问题,请尝试:

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (df.isVisible) {
        fm.beginTransaction().remove(df).commit();
    } else {
        super.onBackPressed();  
    }
}

(尽管这不太理想,因为您正在硬编码要删除的内容)。

导航正常,但是在片段的onCreateView中,我对片段视图使用了setContentView(),该片段视图将片段视图绘制到了主活动上,因此,如果按下两次后退按钮似乎会退出,但实际上是在返回对于主要活动,它只是重新绘制了主要活动,因此无法分辨。

感谢您的帮助@RogueBaneling!

原始代码:

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

    View fragmentView = inflater.inflate(R.layout.fragment_detail, container, false);
    fragmentView.setClickable(true);
    getActivity().setContentView(R.layout.fragment_detail);


    final TextView movieTitleText = (TextView) getActivity().findViewById(R.id.movie_title_text);
    movieTitleText.setText(title);

    // editing textView code... 

    return fragmentView;
}

成:

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

    View fragmentView = inflater.inflate(R.layout.fragment_detail, container, false);
    fragmentView.setClickable(true);


    final TextView movieTitleText = (TextView) fragmentView.findViewById(R.id.movie_title_text);
    movieTitleText.setText(title);

    // editing textView code... 

    return fragmentView;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM