【问题标题】:Load Fragment in Activity OnCreate在 Activity OnCreate 中加载 Fragment
【发布时间】:2017-07-10 16:57:25
【问题描述】:

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

Fragment 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 类中编写程序以在创建时加载片段?

我想这样做,所以我可以对其进行编程以首先加载片段 1(MenuFragment),而无需它已经存在。两者都可见的唯一原因是片段 1 包含在我的 main.xml 中

【问题讨论】:

  • 您如何最初动态创建片段? 我动态创建了片段 2,但片段 1 (MenuFragment) 是静态创建的,这就是它留在那里的原因。我使用相同的 replaceFragment 代码将 Fragment 1 动态地放入视图中并且它可以工作,但是 findViewByIds 让它崩溃了。我不得不将其注释掉,现在我无法测试 onClickListener 以查看它是否进入 Fragment 2
  • 修复了所有问题。 解决方案: 1) 不要在 xml 文件中静态编程片段 2) 使用代码 Here

标签: android android-fragments fragment load


【解决方案1】:

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

XML

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

科特林

fun replaceFragment(fragment:Fragment){
    supportFragmentManager
            .beginTransaction()
            .replace(R.id.frameContainer, fragment)
            .commit()
}

Java

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

【讨论】:

  • FrameLayout 在 main.xml 中?如果我这样做,会出现同样的问题...如何在启动时将片段放入 FrameLayout 中?
  • 这是给我方向的一个很好的答案。我的主要问题最终是由于 onclicklistener 和在片段中找到按钮而导致应用程序崩溃。我最终不得不在片段 java 文件中找到按钮并实现一个侦听器,而不是在主 java 文件中。谢谢。
  • 很高兴知道我正在指导。继续做安卓开发。我认为你做得很好。
【解决方案2】:

尝试使用 LinearLayout 或 FrameLayout 等布局作为片段的容器,并在 onCreate 中制作类似

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 哇,成功了。我想知道为什么......似乎不是框架容器的布局不是问题。我讨厌使用框架布局,因为相对布局对我来说太简单了。我也尝试弄乱约束布局,无法弄清楚。猜猜我总是可以在框架布局中放置一个相对布局
    • 所有颜色都叠加在它上面。我希望它替换片段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多