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

问题描述:

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

这里是我的片断创建&交易在活动类:()

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.如果需要,我可以添加我的片段代码

+0

什么是您的活动类扩展?即“ActionBarActivity”,“Activity”等? – RogueBaneling

+0

@RogueBaneling活动类扩展AppCompatActivity –

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

(虽然这是不太理想的,因为你正在编码要删除的内容)。

+0

我试了一下,仍然需要两次后退,并退出到主屏幕。我无法弄清楚为什么它不会回到主要活动 –

+0

恩,好吧。你可以尝试使用'fragmentTransaction.add'而不是'.replace'?如果仍然不起作用,你可以尝试使用'fm.beginTransaction()。remove(df)。在你的'onBackPressed'中提交()'? – RogueBaneling

+0

如果这些都不帮助,我会删除我的答案,因为我只是猜测。 – RogueBaneling

导航是工作,但在我的片段的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; 
}