2013-05-19 45 views
0

我制作了一个带有两个选项卡的ActionBar - 一个用于片段和bfragment。片段包含一个按钮。单击片段上的按钮将导致它更改为cfragment。但是,再次单击该选项卡会导致再次加载碎片。我能做些什么来防止这种情况,主要是在标签上说:“当有人点击你时,加载最后一个片段状态(在本例中为cfragment)?”在Tab中保存片段状态

这是我MainActivity.java:

public class MainActivity extends Activity { 

public static Context appContext; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    appContext = getApplicationContext(); 

    //ActionBar 
    ActionBar actionbar = getActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A"); 
    ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B"); 

    Fragment PlayerFragment = new AFragment(); 
    Fragment StationsFragment = new BFragment(); 

    PlayerTab.setTabListener(new MyTabsListener(PlayerFragment)); 
    StationsTab.setTabListener(new MyTabsListener(StationsFragment)); 

    actionbar.addTab(PlayerTab); 
    actionbar.addTab(StationsTab); 
} 

我TabListener:

class MyTabsListener implements ActionBar.TabListener { 
public Fragment fragment; 

public MyTabsListener(Fragment fragment) { 
    this.fragment = fragment; 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    Toast.makeText(MainActivity.appContext, "Reselected!", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    ft.replace(R.id.fragment_container, fragment); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    ft.remove(fragment); 
} 
} 

最后,我AFragment.java:

public class AFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.afragment, container, false); 
    Button mButton = (Button) view.findViewById(R.id.button1); 
    mButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      CFragment fragment = new CFragment(); 
      fragmentTransaction.replace(R.id.fragment_container, fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 
    return view; 
} 
} 

如何保存cfragment进入选项卡以这种方式单击第一个选项卡不会导致再次加载片段?谢谢。

回答

1

状态不会被保存,因为每次更改选项卡时都会添加新的片段。

在“onTabUnselected`,不要删除,但分离/隐藏

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if (fragment != null) { 
    ft.detach(fragment); 
    } 
} 

而且在onTabSelected,检查,看看是否已经片段存在,而不是更换

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); 
    if(fragment == null) { 
    fragment = Fragment.instantiate(mActivity, mClass.getName()); 
    ft.add(R.id.fragment_container, fragment, tag); 
    } else { 
    ft.attach(fragment); 
    } 
} 
+0

了'onTabSelected'的给我一个错误。你能澄清一下吗? – Si8

+0

你遇到什么错误?你确定片段是一个实例变量吗? – loadedion

+0

我有两个选项卡和一个选项卡有一些文本框来输入数据,一旦我切换到另一个选项卡,并返回到原始选项卡的文本框失去其价值。这就是你要解决的问题? – Si8