在活动中加载片段OnCreate

时间:2017-07-10 16:57:25

标签: android android-fragments fragment load

问题:从片段1切换到片段2,切换发生,但两者都可见。 (片段2成为焦点)

片段1是MenuFragment 片段2是GameFragment

我相信这种情况正在发生,因为我的片段1包含在我的主activity.xml

   <fragment
        android:id="@+id/menu_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_menu">
    </fragment>

main.xml中的代码将片段加载到主活动中。每当我使用以下代码用游戏片段替换菜单片段时:

public void replaceFragment(Fragment fragment) 
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.gameview_layout, gameFragment);
    fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.commit();
}

游戏片段出现并叠加在菜单片段上方。如何让菜单片段消失?我确信一个简单的修复方法是makeVisible(false)或类似的东西,但我相信真正的问题是在xml文件中编程以包含MenuFragment。

问题:如何在main.java类中编程以在create上加载片段?

我想这样做,所以我可以将它编程为首先加载片段1(MenuFragment),而不是它已存在。两者都可见的唯一原因是因为片段1包含在我的main.xml

4 个答案:

答案 0 :(得分:9)

您应该创建一个FrameLayout(或任何其他),而不是创建两个片段,并在切换期间替换帧布局,如下例所示。

<强> XML

<FrameLayout
    android:id="@+id/frameContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

<强>爪哇

public void replaceFragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameContainer, fragment);
    fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.commit();
}

答案 1 :(得分:1)

尝试使用像LinearLayout或FrameLayout这样的布局作为片段的容器,并在onCreate中使用

getFragmentManager().beginTransaction()
    .add(R.id.menu_fragment, MenuFragment.getInstance())
    .commit();

并将容器ID重命名为“@ + id / fragmentContainer”或类似名称。

答案 2 :(得分:1)

在片段布局xml中添加背景颜色来解决问题

答案 3 :(得分:1)

您应该创建一个FrameLayout(或任何其他布局),而不是创建两个片段,并在切换过程中替换框架布局,如下例所示。

JAVA

public void loadFragment(Fragment fragment) {
    String backStateName = fragment.getClass().getName();
    FragmentManager fragmentManager = getSupportFragmentManager();
    boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
    if (!fragmentPopped) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.frameContainer, fragment);
        fragmentTransaction.addToBackStack(backStateName);
        fragmentTransaction.commit();
    }
}

XML

<FrameLayout
    android:id="@+id/frameContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>