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

时间:2015-10-16 23:51:18

标签: java android android-fragments android-activity navigation

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

这是我的片段创建& 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次按下才能返回主屏幕。请记住,我正在尝试返回原始活动。

有什么建议吗?

P.S。我可以根据需要添加我的片段代码

2 个答案:

答案 0 :(得分:0)

您的第二个版本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();  
    }
}

(虽然这是不太理想的,因为你要对要删除的内容进行硬编码)。

答案 1 :(得分:0)

导航工作正常,但在我的Fragment的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;
}