2

我有一個小應用程序,有一個活動和很多碎片;我與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合作? 我認爲應該有一個更簡單的方法,不是嗎?

回答

0

我知道它太晚了,但它會幫助其他人。使用show和hide代替replace.Here是一個示例代碼。

private class MyTabListener implements ActionBar.TabListener { 
    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     switch (tab.getPosition()) { 
     case 0: 

      if (frag1 == null) { 
       // If not, instantiate and add it to the activity 
       frag1 = Fragment.instantiate(getApplicationContext(), 
         FeedsActivity.class.getName()); 
       ft.add(android.R.id.content, frag1, "Feeds"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag1); 
      } 
      return; 

     case 1: 
      if (frag2 == null) { 
       // If not, instantiate and add it to the activity 
       frag2 = Fragment.instantiate(getApplicationContext(), 
         ProfileActivity.class.getName()); 
       ft.add(android.R.id.content, frag2, "Profile"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag2); 
      } 
      return; 
     case 2: 

      if (frag3 == null) { 
       // If not, instantiate and add it to the activity 
       frag3 = Fragment.instantiate(getApplicationContext(), 
         History.class.getName()); 
       ft.add(android.R.id.content, frag3, "History"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag3); 
      } 

      return; 

     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     if (frag1 != null) { 
      // Detach the fragment, because another one is being attached 
      switch (tab.getPosition()) { 
      case 0: 
       ft.hide(frag1); 
       return; 
      case 1: 
       ft.hide(frag2); 
       return; 
      case 2: 
       ft.hide(frag3); 
       return; 

      } 

     } 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
    } 
}