保存选项卡内的片段状态 [英] Save fragment state inside a Tab
问题描述
我做了个动作条有两个选项卡 - 一个用于afragment和bfragment。 afragment包含一个按钮。点击afragment按钮,将导致其改为cfragment。但是,单击选项卡再次结果afragment被再次加载。我可以做prevent这算什么,基本上到标签,说:当有人点击你,加载最后一个片段的状态(在这种情况下,cfragment)?
I made an ActionBar with two tabs - one for afragment and bfragment. afragment contains a button. Clicking the button on afragment will result it to change to cfragment. However, clicking the tab again results to afragment being loaded again. What can I do to prevent this, to essentially say to the tab, "When somebody clicks on you, load the last fragment state (in this case, cfragment)?"
这是我的MainActivity.java:
This is my 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:
My 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:
And finally, my 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到标签以这样一种方式,点击第一个选项卡将不会导致再次afragment加载?谢谢你。
How do I save cfragment into the tab in such a way that clicking the first tab would not result to afragment loading again? Thank you.
推荐答案
的状态不会被保存,因为你每次更换标签时添加一个新的片段。
The state is not being saved because you are adding a new fragment every time you change tabs.
在'onTabUnselected`,不要删除,但分离/隐藏
In 'onTabUnselected`, don't remove, but detach/hide
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (fragment != null) {
ft.detach(fragment);
}
}
而在 onTabSelected
,请检查是否片段,而不是已经存在的替换
And in onTabSelected
, check to see if the fragment exists already instead of replacing
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);
}
}
这篇关于保存选项卡内的片段状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!