ActionBarSherlock with navlist:如何保存Fragments的实例

时间:2012-10-15 17:50:15

标签: android android-fragments android-actionbar actionbarsherlock

我有一个带有一个Activity和很多片段的小应用程序;我和SherlockFragment合作。 我的问题是我不知道如何保存片段的实例以获得出现在特殊导航列表项目上的最后一个片段。

例如为: 我选择一个导航列表项目,例如“信息”。然后我得到FragmentA,FragmentA从SherlockListFragment扩展,所以我可以选择一个ListItem然后我得到FragmentB。 FragmentB也从SherlockListFragment扩展,所以我得到了FragmentC等等。

现在问题如下: 当我选择其他导航列表项时,例如“家”我得到FragmentD。 现在我再次选择我的导航列表项“info”,我希望FragmentC出现。

在我的Code-snippet中,我只是替换了片段,但我需要知道哪个片段显示为最后一个。

我的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;
       }
  }
}

My Fragments看起来像这样:

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

我真的看了一整天的解决方案,但我找不到可以帮助我的东西。 我认为我需要这样的标签: Actionbarsherlock + tabs + multi fragments? 或者像TabHost for Lists ......

我希望你能帮助我。

最诚挚的问候

修改

我只是隐藏和显示问题。 在我的xml-layout中,我有一个带有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时,Activity会被破坏。

但我希望在按下BackButton后会出现FragmentB - &gt; FragmentA,现在我可以完成活动。

我知道我可以覆盖Backbutton,但我想我犯了一些错误。 也许我应该分离并附上? 我认为应该有一种更简单的方法,不是吗?

1 个答案:

答案 0 :(得分: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
    }
}