【发布时间】:2014-12-04 16:56:09
【问题描述】:
我有一个带有 ActionBar.TabListener 的片段。如果片段已经创建,我在 TabListener 中调用以显示片段。 这适用于所有片段的纵向,以及所有片段的横向,除了包含 pagerViewer 的片段。对于这个有问题的片段,当手机旋转(并重新选择选项卡)时,没有任何显示。
这是我创建片段的方式(浓缩):
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.support.v4.app.FragmentActivity;
public class MainFragmentActivity extends FragmentActivity implements ResultsListener
{
FragmentManager fragment_manager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
bundle = savedInstanceState;
System.out.println("bundle = " + bundle);
fragment_manager = getFragmentManager();
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setTitle(getApplicationContext().getApplicationInfo().labelRes);
ActionBar.Tab tab_jobList = actionBar.newTab().setText(R.string.stringJobs);
tab_jobList.setIcon(R.drawable.text_list_white);
actionBar.addTab(tab_jobList.setTabListener(new MyTabsListener<JobListLV>(this, "jobList", JobListLV.class, getFragmentManager())));
actionBar.addTab(tab_trends.setTabListener(new MyTabsListener<TrendsPagerHolder>(this, "trendsPagerHolder", TrendsPagerHolder.class, getFragmentManager())));
}
这是具有 TabListener 的内部类:
public MyTabsListener(Activity activity, String tag, Class<T> clz, Bundle args, FragmentManager fragmentManager)
{
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
fm = fragmentManager;
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
Log.e("mFragment constructor", "mFragment = " + mFragment);
fragmentTrendsPagerHolder = (TrendsPagerHolder) mActivity.getFragmentManager().findFragmentByTag("trendsPagerHolder");
if (mFragment != null && !mFragment.isDetached())
{
FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
if (fragmentTrendsPagerHolder != mFragment)
{
ft.hide(mFragment);
ft.commit();
}
}
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
displayTab(tab, ft);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft)
{
if (mFragment != null)
{
ft.hide(mFragment);
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft)
{
displayTab(tab, ft);
}
private void displayTab(Tab tab, FragmentTransaction ft)
{
fragmentJobListDetails = mActivity.getFragmentManager().findFragmentByTag("jobDetails");
if (fragmentJobListDetails != null && !fragmentJobListDetails.isDetached())
{
ft.hide(fragmentJobListDetails);
}
if (mFragment == null || !mFragment.isAdded())
{
mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
ft.add(android.R.id.content, mFragment, mTag);
}
else
{
System.out.println("mFragment.isAdded() = " + mFragment.isAdded());
Log.e("mFragment", "mFragment = " + mFragment);
ft.show(mFragment);
}
}
}// end MyTabsListener
有解决此问题的建议吗? 谢谢。
【问题讨论】:
-
在旋转时,您的视图是否按照应有的方式重新创建(除非 AndroidManifest 中另有说明)?
-
我不确定您具体指的是什么。我的假设是操作系统会自己保留这些片段,所以我只需要调用它们。另外,我认为我在 Manifest 中并没有为此做任何特别的事情。
-
在旋转时,您的
Activity(默认)会重新创建。我不确定这是否与您的问题有关;只是一个线索。 -
是的,我知道活动需要将它们的数据保存在 Bundle 上,但我的理解是碎片会被操作系统保留。当我运行日志并获取片段的内存位置时,前版本和轮换后版本的数据完全相同