Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类生命周期与ActionBar Sherlock选项卡片段_Java_Android_Actionbarsherlock - Fatal编程技术网

Java 类生命周期与ActionBar Sherlock选项卡片段

Java 类生命周期与ActionBar Sherlock选项卡片段,java,android,actionbarsherlock,Java,Android,Actionbarsherlock,我正在开发我的第一个Android应用程序之一,并且一直在理解控制器/类的生命周期是如何安排的。我有iOS的背景 基本上我所做的就是遵循这一点 根据我的理解,我将一个TabListener绑定到片段上。切换选项卡时,将调用TabListener的onTabSelected(),并且每次创建FragmentA/FragmentB的新实例时都会调用该选项卡 这导致了这样一个事实:每次切换选项卡时,都会再次调用所有onCreate..()方法 我不想每次切换选项卡时都创建一个新的片段实例,而是使用在应

我正在开发我的第一个Android应用程序之一,并且一直在理解控制器/类的生命周期是如何安排的。我有iOS的背景

基本上我所做的就是遵循这一点

根据我的理解,我将一个TabListener绑定到片段上。切换选项卡时,将调用TabListener的
onTabSelected()
,并且每次创建FragmentA/FragmentB的新实例时都会调用该选项卡

这导致了这样一个事实:每次切换选项卡时,都会再次调用所有
onCreate..()
方法

我不想每次切换选项卡时都创建一个新的片段实例,而是使用在应用程序启动时初始创建的片段实例


问题是我如何切换选项卡而不杀死其中的片段?

您可以通过附加/分离片段来实现这一点,每次取消选择选项卡时,在选项卡侦听器上分离当前片段,并在onTabSelected方法上检查您以前是否创建过片段

private Fragment       mFragment;
private final String   mTag;
private final Class<T> mClass;

public TabListener(String pTag, Class<T> pClass) {
    mTag = pTag;
    mClass = pClass;
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if ( mFragment == null ) {
        try {
            mFragment = (Fragment)mClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        ft.add(R.id.fragment_container,mFragment,mTag);
    } else {
        ft.attach(mFragment);
    }   
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {

    if ( mFragment != null ) {
        ft.detach(mFragment);
    }
}

   public void onTabReselected(Tab tab, FragmentTransaction ft) {
    //Nothing   
   }
私有片段;
私有最终字符串mTag;
私人期末班;
公共TabListener(字符串pTag,类pClass){
mTag=pTag;
mClass=pClass;
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
if(mFragment==null){
试一试{
MFFragment=(Fragment)mClass.newInstance();
}捕获(实例化异常e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}
ft.add(R.id.fragment_容器、mFragment、mTag);
}否则{
ft.attach(mFragment);
}   
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
if(mFragment!=null){
ft.分离(mFragment);
}
}
已重新选择公共无效页签(页签,碎片事务){
//没什么
}
然后您可以实例化您的侦听器,如中所示

TabListener l = new TabListener<MyFragment>(tabTag, MyFragment.class)
TabListener l=新的TabListener(tabTag,MyFragment.class)