2015-10-16 26 views
1

我在活動中有一個片段,我可以使用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 –

回答

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

(雖然這是不太理想的,因爲你正在編碼要刪除的內容)。

+0

我試了一下,仍然需要兩次後退,並退出到主屏幕。我無法弄清楚爲什麼它不會回到主要活動 –

+0

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

+0

如果這些都不幫助,我會刪除我的答案,因爲我只是猜測。 – RogueBaneling

0

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