Fragment的调用方法没有效果

时间:2013-01-16 16:09:08

标签: android android-fragments fragment

首先,谢谢你的帮助。 这对我来说是个难题。

请我有一个包含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)

实际上碎片是否被破坏?

此外,每当新添加的片段是新片段或旧片段时, 为什么打电话给

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

}

1 个答案:

答案 0 :(得分:1)

当确切的片段被破坏时,无法确切知道。所有你知道的是它是在onStop()之后和onDetach()之前调用的。

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

SplashFragment.enableAll很可能是需要在Fragment的onAttach或onResume内部调用的东西,但如果没有你的解释,也不可能知道。

修改

好的,所以我认为你错了。您有效地尝试完成的是在再次显示时以某种方式(取决于某些状态)“配置”您的片段。这里的问题是你不确切知道片段的View层次结构何时被夸大,或者什么时候它正好附加到Activity等等。换句话说,试图调用影响片段UI的方法只是在基础上引用片段的对象是一个错误。你需要进入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");

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