将 Fragment 放在前面(无 Fragment 娱乐) [英] Bring Fragment to Front (No fragment recreation)

查看:26
本文介绍了将 Fragment 放在前面(无 Fragment 娱乐)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个片段 F1 F2 F3 F4 都可以从侧边栏访问.

I have three fragments F1 F2 F3 F4 all are accessible from sidebar.

所有四个都可以随时以任何顺序调用,

all four can be called at any time and in any order,

现在我想要的是,如果 F1 已经被点击(创建),那么永远不要再创建 F1,而只是使用片段管理器将片段 F1 带回到前面.所有其他片段相同

到目前为止我对容器中的每个片段都尝试了这个(片段活动)

So far i tried this for every fragment in my container (FRAGMENT ACTIVITY)

if (fragmentManager.findFragmentByTag("apps")==null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

Fragment newFragment = new CategoriesFragment();
transaction.replace(R.id.content_frame, newFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();   
} else{

}

If 部分确保我没有重新创建片段(如果它已经创建了),但是我应该在 else 部分写什么,以便 已经创建的片段可以被带到视图层次结构的前面

If part ensures me NO fragment is recreated (If its created already) again, but what should i write in else part so that already created fragment can be brought to front in View Hierarchy

请帮忙,我被困在这两天了.

Please Help, i'm stuck at this for 2 days.

推荐答案

我会把这段代码放在活动类中,必须有 FrameLayout 和 id R.id.fragment_container.

I would put this code in activity class, that must have FrameLayout with id R.id.fragment_container.

private Fragment1 F1;
private Fragment2 F2;
private Fragment3 F3;
private Fragment4 F4;       

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    F1 = new Fragment1();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit();
    F2 = new Fragment2();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit();
    F3 = new Fragment3();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit();
    F4 = new Fragment4();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit();

    //if needed show F1
    getSupportFragmentManager().beginTransaction().show(F1).commit();

}

并为按钮单击添加此内容:

And add this for button click:

public void onBtnClick(View view){
    if(mShowF1){
        getSupportFragmentManager().beginTransaction().show(F1).commit();
        getSupportFragmentManager().beginTransaction().hide(F2).commit();
        getSupportFragmentManager().beginTransaction().hide(F3).commit();
        getSupportFragmentManager().beginTransaction().hide(F4).commit();
    }
    //...
}

点击按钮时,您可以显示您想要的片段并隐藏其他片段.

On button click(s) you can show, that fragment that you want and hide others.

注意 (@developer1011):用于活动保存状态调用commitAllowingStateLoss().小心使用,因为片段不会随着活动恢复而恢复.

NOTE (@developer1011): For use after activity save state call commitAllowingStateLoss (). Use with care, because fragment is not restored with activity restoration.

注意:MainActivity 应该为每个 Fragment 实现 OnFragmentInteractionListener.

NOTE: MainActivity should implement OnFragmentInteractionListener for each Fragment.

public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//..

    @Override
    public void onFragmentInteraction(Uri uri) {
        //
    }
}

这篇关于将 Fragment 放在前面(无 Fragment 娱乐)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆