把碎片带到前面(没有片段娱乐)

Nit*_*sra 22 android android-fragments android-fragmentactivity

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

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

现在我想要,如果F1已经被点击(创建)然后再也没有创建F1,而只是使用片段管理器将片段F1带回到前面.所有其他片段都一样

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

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{

}
Run Code Online (Sandbox Code Playgroud)

Ifpart确保我重新创建了NO片段(如果已经创建了它),但是我应该在什么else部分写入,以便已经创建的片段可以在View Hierarchy中显示出来

请帮忙,我坚持了2天.

Sol*_*ata 10

我将此代码放在活动类中,必须具有ID为R.id.fragment_container的FrameLayout.

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

}
Run Code Online (Sandbox Code Playgroud)

并为按钮点击添加此项:

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();
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

注意: MainActivity应为每个片段实现OnFragmentInteractionListener.

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

    @Override
    public void onFragmentInteraction(Uri uri) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)


nik*_*kvs 6

按标签获取片段并将其替换为容器,

else{
Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps");
transaction.replace(R.id.content_frame,existingFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

更新:您可以使用隐藏和显示片段来避免重新创建.而不是使用"transaction.replace()"

fragmentTransaction.hide(<oldFragment>);
fragmentTransaction.show(<newFragment>);
Run Code Online (Sandbox Code Playgroud)


erl*_*man 5

爪哇:

如果您只是尝试添加 a 而Fragment不必担心重新创建它,那么我认为我编写的添加方法Fragment可以完成您的工作。

public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) {


    FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager ();
    manager.findFragmentByTag ( tag );
    FragmentTransaction ft = manager.beginTransaction ();

    if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag..
        ft.add ( fragmentHolderLayoutId, fragment, tag );
        ft.addToBackStack ( tag );
        ft.commit ();
    }
    else {
        for (Fragment frag : manager.getFragments()){
          ft.hide(frag)
        }
        ft.show ( manager.findFragmentByTag ( tag ) ).commit ();
    }
}
Run Code Online (Sandbox Code Playgroud)

科特林:

fun attachFragment(fragmentHolderLayoutId: Int, fragment: Fragment?, tag: String?) {
    val manager: FragmentManager = supportFragmentManager
    val ft: FragmentTransaction = manager.beginTransaction()
    if (manager.findFragmentByTag(tag) == null) { // No fragment in backStack with same tag..
        ft.add(fragmentHolderLayoutId, fragment!!, tag)
        ft.addToBackStack(tag)
        ft.commit()
    } else {
        //Hide other fragments
        for (frag in manager.fragments){
            ft.hide(frag)
        }
        //Shows the selected fragment.
        ft.show(manager.findFragmentByTag(tag)!!).commit()
    }
}
Run Code Online (Sandbox Code Playgroud)