Tabs content is visible on top of another after screen rotation
我已经在片段问题上阅读了很多关于stackoverflow但我无法找到解决问题的方法。
我有一个Tabhost,当我更改设备的旋转然后选择另一个选项卡时,第一个选项卡中的视图也可见。 因此,两个标签内容都是彼此重叠的。
我正在使用自定义tablistener,每个选项卡都是一个片段。 我可以用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public class TabListener<T extends Fragment> implements ActionBar.TabListener { private Fragment fragment; private final FragmentActivity activity; private final String tag; private final Class< T > myClass; private long id; public TabListener(FragmentActivity a, String t, Class< T > c, long id) { tag = t; myClass = c; activity = a; this.id = id; } /** The following are each of the ActionBar.TabListener callbacks */ public void onTabSelected(Tab tab, FragmentTransaction ft) { // Check if the fragment is already initialized if (fragment == null) { fragment = Fragment.instantiate(activity, myClass.getName()); // Sends stored TimerClass id to fragment if(id != 0) { Bundle b = new Bundle(); b.putLong("id", id); fragment.setArguments(b); } ft.add(android.R.id.content, fragment, tag); } else { // If it exists, simply attach it in order to show it ft.attach(fragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (fragment != null) ft.detach(fragment); } public void onTabReselected(Tab tab, FragmentTransaction ft) { editNameDialog(); } } |
我不知道这应该在片段,活动或TabListener中处理。 正确查看选项卡内容,直到我更改屏幕方向。
我在stackoverflow上找到了部分答案。
解
这就是我解决问题的方法。 在我放置的标签监听器中:
1 | fragment = activity.getSupportFragmentManager().findFragmentByTag(tag); |
在
方向更改后选择正确的选项卡
当屏幕旋转时,重新创建活动(?),我们需要存储最后选择的选项卡索引。
保存上次选择的选项卡(这将在活动中):
1 2 3 4 5 | @Override protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("lastTab", actionBar.getSelectedNavigationIndex()); } |
要加载选项卡索引,将其放在活动的
1 2 3 | if (savedInstanceState != null) { actionBar.selectTab(actionBar.getTabAt(savedInstanceState.getInt("lastTab"))); } |
初始化片段中的控制器
为了防止控件显示并表现出奇怪,我将片段中的所有控件都移动到
1 2 3 4 5 6 7 | @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.timer, container, false); initializeControls(v); setSeekBars(v); return v; } |
我希望这能帮助其他人。