我有一個小應用程序,有一個活動和很多碎片;我與SherlockFragment合作。 我的問題是,我不知道如何保存片段的實例,以獲取出現在特殊的navlist項目上的最後一個片段。帶有navlist的ActionBarSherlock:如何保存碎片實例
例如: 我選擇一個navlist項目,例如「信息」。然後我得到FragmentA,FragmentA從SherlockListFragment擴展,所以我可以選擇一個ListItem,然後得到FragmentB。 FragmentB也從SherlockListFragment擴展,所以我得到FragmentC等等。
現在的問題如下: 當我選擇另一個navlist項目,例如「家」我得到FragmentD。 現在我再次選擇我的導航條目「信息」,我希望FragmentC出現。
在我的代碼片段中,我只是替換片段,但我需要知道哪個片段顯示爲最後一個。
我SherlockFragmentActivity:
public class MainActivity extends SherlockFragmentActivity implements ActionBar.OnNavigationListener{
private FragmentHome mFragmentHome = null;
private FragmentInfo mFragmentInfo = null;
private static final String mListItemHome = "starthome";
private static final String mListItemInfo = "startinfo";
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.My_Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
Context context = getSupportActionBar().getThemedContext();
// Navlist
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context,
R.array.locations, R.layout.sherlock_spinner_dropdown_item);
list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(list, this);
mFm = getSupportFragmentManager();
//Init of my Fragments:
mFragmentHome = new FragmentHome();
mFragmentInfo = new FragmentInfo();
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
FragmentTransaction ft = mFm.beginTransaction();
switch(itemPosition){
case 0:
ft.replace(R.id.fragment_content, mFragmentHome);
ft.addtoBackStack(mListHome);
ft.commit();
return true;
case 1:
ft.replace(R.id.fragment_content, mFragmentInfo);
ft.addtoBackStack(mListInfo);
ft.commit();
return true;
default:
return false;
}
}
}
我的片段似乎是這樣的:
public class FragmentInfo extends SherlockListFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//disable the HomeButton as "Up"-Button
ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setHomeButtonEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
...
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
bundle.putString("x", x);
bundle.putString("y", y);
FragmentManager fm = getFragmentManager();
FragmentInfo fragment = new FragmentInfo(fm);
fragment.setArguments(bundle);
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.replace(R.id.fragment_content, fragment);
ft.addToBackStack("info");
ft.commit();
}
}
我真的看了一整天的解決方案,但我沒有找到soemthing,可以幫助我。 我想我需要像這樣的標籤: Actionbarsherlock + tabs + multi fragments? 或者類似的東西用於列出TabHost ...
我希望你能幫助我。
與問候
編輯:
我只是得到具有隱藏和顯示問題。 在我的xml佈局中,我有一個帶有id:fragment_content的Framelayout。 此ID始終用於替換其他片段。 現在我用id:fragment_info添加另一個Framelayout。 我這樣做是爲了得到我用FragmentManager替換的最後一個片段。
現在,我對NavigationItemSelected方法似乎是這樣的:
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
FragmentTransaction ft = mFm.beginTransaction();
switch(itemPosition){
case 0:
if(mFragmentHome==null){
mFragmentHome = new FragmentHome();
ft.replace(R.id.fragment_content, mFragmentHome)
ft.addToBackStack(mListItemHome);
ft.commit();
}else{
if(mFragmentHome.isHidden()){
ft.show(mFragmentHome);
ft.replace(R.id.fragment_content, mFragmentHome)
ft.addToBackStack(mListItemHome);
ft.commit();
}
ft.hide(mFragmentInfo);
}
case 1:
if(mFragmentInfo==null){
mFragmentInfo = new FragmentInfo();
ft.replace(R.id.fragment_info, mFragmentInfo)
ft.addToBackStack(mListItemInfo);
ft.commit();
ft.hide(mFragmentHome)
}else{
ft.hide(mfragmentHome();
//here I get the last Fragment I choose under the navlist-Item "Info"
Fragment f = getFragmentManager.findFragmentById(R.id.fragment_info);
ft.replace(R.id.fragment_info, f);
ft.addToBackStack(mListItemInfo);
ft.commit();
}
ft.hide(mFragmentHome);
default:
return false;
}
}
}
我的XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/fragment_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/fragment_info"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
但現在我有我的後退按鈕的另一個問題。 當我選擇菜單信息並瀏覽FragmentA到FragmentB到FragmentC,然後我選擇navlist-Item「Home」並再次navlist-Item「Info」,所以我得到FragmentC。 但是當我現在按下BackButton時,活動將被破壞。
但我想按下BackButton後FragmentB - > FragmentA,現在我可以完成活動。
我知道我可以重寫Backbutton,但我想我犯了一些錯誤。 也許我應該與detach合作? 我認爲應該有一個更簡單的方法,不是嗎?