【问题标题】:FragmentTransaction show() doesn't work on specific fragment after rotateFragmentTransaction show() 对旋转后的特定片段不起作用
【发布时间】: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 上,但我的理解是碎片会被操作系统保留。当我运行日志并获取片段的内存位置时,前版本和轮换后版本的数据完全相同

标签: android android-fragments


【解决方案1】:

在 ft.show() 之后调用 ft.commit()。所以应该是这样的:

private void displayTab(Tab tab)
{   
    FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();

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

    ft.commit();
}

}//结束MyTabsListener

另外,创建一个新的片段事务来处理 displayTab 方法的可能事务。

【讨论】:

  • 这不起作用。我收到 java.lang.IllegalStateException 的运行时错误:commit already called
  • 你试过我最近的修改了吗?
  • 对不起,我没有注意到有新的修改。我尝试了整个方法,提交不再给我运行时错误,但我回到旋转后不显示任何内容。这可能是我的 onCreate 方法有问题,还是我没有使用 Fragment 的支持库?
  • 您还有其他建议吗?感谢您的帮助
  • 这应该可以帮助您在旋转后获取片段实例。 stackoverflow.com/questions/5164126/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2016-08-23
相关资源
最近更新 更多