0

首先感谢您的帮助。这对我来说是一个难题。

请我有一个包含 5 个片段的活动;在用户交互时,片段被交换。

我正在使用 ACL。

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        stackArray =new ArrayList<Integer>();
        favQ =new ArrayList<Stock>();
        tablet=true;
        mBound = false;
        fragmentActivity = this;
        setContentView(R.layout.splashmain);
        splashfragment =new splashFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction =     fragmentManager.beginTransaction();       
        fragmentTransaction.add(R.id.splashview,splashfragment);
        fragmentTransaction.commit();
        /*
            other stuff....
            */
        fragmentlista = new listafragment();
        fragmentfavourites= new favouritesFragment() ;
        worstbest = new WorstBest();
        searchfragment = new searchFragment(); 
        /*
            other stuff....
            */
        lt = mService.ritira();
        worst=mService.ritiraWorst();
        best=mService.ritiraBest();
        favQ.clear();
        favQ.addAll(mService.ritiraFav());          
            fragmentlista.prendiLista(lt);
        worstbest.prendiListaWorst(worst);
        worstbest.prendiListaBest(best);
        if(favQ.size()>0)fragmentfavourites.prendiLista(favQ);

// --->>>>HERE THE SAME METHOD enableAll() WORKS!!! <---
// --->>>>HERE THE SAME METHOD enableAll() WORKS!!! <---

            splashfragment.enableAll();

// --->>>>HERE THE SAME METHOD enableAll() WORKS!!! <---
// --->>>>HERE THE SAME METHOD enableAll() WORKS!!! <---
        /*
            other stuff....
            */
        }

//Method invoked to setup the configuration of the screen is layoutSchermo(int conf)
public static void layoutSchermo(int conf){
//Check if it is a Tablet in Landscape mode or not
//if it finds v2 than we are on a LARGE screen, then we check ORIENTATIO
    fragmentActivity.setContentView(R.layout.main);
    View v2 =(View)fragmentActivity.findViewById(R.id.view2);
    if(v2==null 
            & 
            fragmentActivity.getResources().getConfiguration().orientation==
            Configuration.ORIENTATION_PORTRAIT)
        tablet=false;

//Calls the screen configuration LIST
if(conf==LIST){     
    fragmentActivity.setContentView(R.layout.main);

    FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(splashfragment);
    fragmentTransaction.commit();
    fragmentManager.executePendingTransactions();
    //Remove old Fragment splashfragment
//At this point I expect the fragment splashfragment is destroyed
//OR NOT???
    fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
    if(!tablet){fragmentTransaction.replace(R.id.view1, fragmentlista);}
    if(tablet){
        fragmentTransaction.replace(R.id.view1, splashfragment);
        fragmentTransaction.replace(R.id.view2,fragmentlista );
        }       fragmentTransaction.addToBackStack(null);   
    stack= fragmentTransaction.commit();
    stackArray.add(stack);
//Brand new fragments added


// --->>>>HERE THE SAME METHOD enableAll() NOT WORKING!!! <---
// --->>>>HERE THE SAME METHOD enableAll() NOT WORKING!!! <---

splashfragment.enableAll(); 
    }

------------

所以基本上会发生什么以及问题出在哪里:

问题出在方法上

layoutSchermo(int conf) 

在方法 layoutSchermo(int conf) 中,

我分离了一个片段(splashfragment)并重新附加它(与另一个片段一起)。

我不清楚当我打电话时

 remove(splashfragment)

实际上 Fragment 是否被销毁?

此外,每当新添加的 Fragment 是新的或旧的,为什么调用

splashfragment.enableAll();

有没有效果?

我希望它可以工作,无论是新的还是旧的片段!

请赐教!

谢谢毛里齐奥

----------

编辑 编辑 编辑 编辑 编辑 编辑 这是片段的代码(我认为它没有多大帮助)

ublic class splashFragment extends Fragment {
    public View v;
    public Button buttonfav;
    public Button buttonBW;
    public Button buttonSe;
    public Button buttonLi;


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        v=inflater.inflate(R.layout.splashnew, container, false);
        RelativeLayout box1 = (RelativeLayout)v.findViewById(R.id.box1);
        //box1.setBackgroundColor(Color.BLUE);
        buttonfav=(Button)v.findViewById(R.id.heart);
        buttonBW=(Button)v.findViewById(R.id.star);
    buttonSe=(Button)v.findViewById(R.id.search);
        buttonLi=(Button)v.findViewById(R.id.lista);

        buttonfav.setBackgroundResource(R.drawable.hearth_gray_tansp);
        buttonBW.setBackgroundResource(R.drawable.star_gray_trans);
        buttonSe.setBackgroundResource(R.drawable.search_gray_transp);
        buttonLi.setBackgroundResource(R.drawable.list_gray_trans);

        buttonfav.setEnabled(false);
        buttonBW.setEnabled(false);
    buttonSe.setEnabled(false);
        buttonLi.setEnabled(false);

        buttonfav.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Quotes.layoutSchermo(Quotes.FAVOURITES);
            }});

        buttonBW.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Quotes.layoutSchermo(Quotes.BESTWORST);
            }});

        buttonSe.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Quotes.layoutSchermo(Quotes.SEARCH);
            }});

        buttonLi.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Quotes.layoutSchermo(Quotes.LIST);
            }});
        return v;           
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {  } 


public void enableAll(){
    buttonfav.setEnabled(true);
    buttonfav.setBackgroundResource(R.drawable.hearth);
    buttonBW.setEnabled(true);
    buttonBW.setBackgroundResource(R.drawable.star);
    buttonLi.setEnabled(true);
    buttonLi.setBackgroundResource(R.drawable.list);
    buttonSe.setEnabled(true);
    buttonSe.setBackgroundResource(R.drawable.search);
}   

}

4

1 回答 1

1

无法确切知道碎片何时被破坏。你只知道它是在 onStop() 之后和 onDetach() 之前调用的。

至于您的 splashFragment.enableAll(),您还没有向我们展示该方法是什么,那么我们怎么知道它为什么不起作用……此外,您还没有向我们展示此 layoutSchermo 方法的更一般的上下文。我这样说是因为我怀疑你做错了。你有一个静态方法,以某种方式引用活动......(不清楚这是如何发生的),在该活动引用上设置内容视图......整个事情只是引发了一些危险信号。

SplashFragment.enableAll 很可能需要在该 Fragment 的 onAttach 或 onResume 内部调用,但同样,如果没有您的解释,就不可能知道。

编辑

好的,所以我认为您的处理方式不正确。当您再次显示 Fragment 时,您有效地尝试完成的是以某种方式(取决于某些状态)“配置”您的 Fragment。这里的问题是您不确切知道 Fragment 的 View 层次结构何时膨胀或何时将其附加到 Activity 等。换句话说,试图调用影响片段 UI 的方法只是基于引用 Fragment 的对象是错误的。您需要连接到 Fragment 的生命周期并以“正确的方式”做事。

以下是我的建议:为您的 Fragment 创建一个静态构造函数,以便轻松创建您想要的正确配置的 Fragment。这可能是这样的:

public class SplashFragment extends Fragment {

    public static SplashFragment newInstance(Bundle bundle) {
        SplashFragment splashFragment = new SplashFragment()
        splashFragment.setArguments(bundle);
        return splashFragment;
    }

    // or alternatively
    public static SplashFragment newInstance(int favResource, int bwResource, int liResource, int seResource,
        boolean favEnabled, boolean bwEnabled, boolean liEnabled, boolean seEnabled) {
        SplashFragment splashFragment = new SplashFragment()
        Bundle bundle = new Bundle();
        bundle.putInt("fav_res", favResource);
        bundle.putInt("bw_res", bwResource);
        bundle.putInt"li_res", liResource);
        bundle.putInt("se_res", seResource);
        bundle.putBoolean("fav_enabled", favEnabled);
        //...And so on  
        splashFragment.setArguments(bundle);
        return splashFragment;
    }

    //Then....

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        //setup your view as normal...then
        buttonFav.setBackgroundResource(getArguments().getInt("fave_res"));
        //.....etc
    }

}

现在,如果您真的需要能够在不创建新实例的情况下操作片段,那么我能想到的唯一方法是添加带有标签的片段,如

replace(int containerViewId, Fragment fragment, String tag)

add (Fragment fragment, String tag)

品种。

然后,稍后您可以尝试让片段管理器为您找到那些片段,即

SplashFragment splashFragment = (SplashFragment) getFragmentManager().findFragmentByTag("some tag here");

检查它是否不为空,然后在其上调用您的方法...

于 2013-01-16T17:29:45.237 回答