Java Android:用另一个片段简单替换片段

Java Android:用另一个片段简单替换片段,java,android,android-fragments,Java,Android,Android Fragments,我的代码遇到了问题 我想要什么 我的活动以Fragment01自动开始。 在Fragment01上有一个按钮,该按钮应将Fragment01替换为Fragment02 发生了什么 当我按下按钮时,我仍然可以在背景中看到Fragment01,而不是替换Fragment01 MainActivity.java: package com.lucky.fragmentexample; import android.app.Activity; import android.app.FragmentMan

我的代码遇到了问题

我想要什么

我的活动以Fragment01自动开始。 在Fragment01上有一个按钮,该按钮应将Fragment01替换为Fragment02

发生了什么

当我按下按钮时,我仍然可以在背景中看到Fragment01,而不是替换Fragment01

MainActivity.java:

package com.lucky.fragmentexample;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    Button bn;
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bn = (Button)findViewById(R.id.button1);

        bn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            Fragment02 fragment02 = new Fragment02();
            fragmentTransaction.replace(R.id.button_fragment_container, fragment02);
            fragmentTransaction.commit();
            }
        });
    }
}
activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

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

        <fragment
            android:id="@+id/fragment01"
            android:name="com.lucky.fragmentexample.Fragment01"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>
</LinearLayout>

布局XML中的
片段
元素只能引用单个片段,不能按照您的意愿进行交换。相反,您需要从布局XML中完全删除
fragment
元素,并将
Fragment01
添加到活动的
onCreate()
方法中的
FrameLayout
中的容器中

因此,删除
片段
元素,如下所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <FrameLayout
       android:id="@+id/button_fragment_container"
       android:layout_width="match_parent"
       android:layout_height="match_parent" 
       />
</LinearLayout>
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.button_fragment_container, new Fragment01());
    transaction.commit();
您需要为每个新事务实例化一个新的
FragmentTransaction
,这意味着您可能需要从实例成员中删除
FragmentManager
FragmentTransaction
,并在每次需要创建片段事务时声明它们是新的

我希望这有帮助

进一步阅读:


布局XML中的
片段
元素只能引用单个片段,不能按照您的意愿进行交换。相反,您需要从布局XML中完全删除
fragment
元素,并将
Fragment01
添加到活动的
onCreate()
方法中的
FrameLayout
中的容器中

因此,删除
片段
元素,如下所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <FrameLayout
       android:id="@+id/button_fragment_container"
       android:layout_width="match_parent"
       android:layout_height="match_parent" 
       />
</LinearLayout>
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.button_fragment_container, new Fragment01());
    transaction.commit();
您需要为每个新事务实例化一个新的
FragmentTransaction
,这意味着您可能需要从实例成员中删除
FragmentManager
FragmentTransaction
,并在每次需要创建片段事务时声明它们是新的

我希望这有帮助

进一步阅读:


将beginTransaction放入onclick函数中,并将R.id.button\u frame\u容器替换为R.id.frame\u容器

在onclick中使用此选项:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, new Fragment02()).commit();

xml文件中的片段不正确。删除该部分。

将beginTransaction放在onclick函数中,并将R.id.button\u fragment\u容器替换为R.id.frame\u容器

在onclick中使用此选项:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, new Fragment02()).commit();
xml文件中的片段不正确。删除该部分。

尝试以下代码:

     FragmentManager fm = getFragmentManager();
     FragmentTransaction fragmentTransaction = fm.beginTransaction();
     fragmentTransaction.replace(R.id.fragment01, new Fragment02());
     fragmentTransaction.commit();
另外,将xml中的“片段”更改为“框架布局”。这可以防止任何一个片段始终留在背景中。

请尝试以下代码:

     FragmentManager fm = getFragmentManager();
     FragmentTransaction fragmentTransaction = fm.beginTransaction();
     fragmentTransaction.replace(R.id.fragment01, new Fragment02());
     fragmentTransaction.commit();
另外,将xml中的“片段”更改为“框架布局”。这可以防止任何一个片段始终留在背景中。

只需一步一步:

首先修改您的布局,删除那边的片段,并在活动中引用您的FrameLayout

现在启动要添加到framelayout的片段类,并调用以下代码:

FragmentTransaction transaction = manager.beginTransaction();
transaction.remove(removePreviousFragmentIfAny);
transaction.add(R.id.button_fragment_container, newFragment);
transaction.commit();
希望它能帮助你度过难关。

一步一步走:

首先修改您的布局,删除那边的片段,并在活动中引用您的FrameLayout

现在启动要添加到framelayout的片段类,并调用以下代码:

FragmentTransaction transaction = manager.beginTransaction();
transaction.remove(removePreviousFragmentIfAny);
transaction.add(R.id.button_fragment_container, newFragment);
transaction.commit();

希望它能帮助你度过难关。

你好,鲁迪,谢谢你。我根据你的建议编辑了我的代码。Frgment01启动时工作正常。但当我按下按钮(show_Fragment02)…@wuzzaa时,应用程序正在崩溃-这可能是因为您试图使用相同的
FragmentTransaction
来执行两个替换事务。尝试在每次执行替换和提交并取出实例成员变量时声明新变量。如果这不起作用,我看不到任何其他错误,你可能需要张贴你的logCat堆栈跟踪。我刚刚有机会检查它,它工作了。谢谢你好,鲁迪,谢谢你。我根据你的建议编辑了我的代码。Frgment01启动时工作正常。但当我按下按钮(show_Fragment02)…@wuzzaa时,应用程序正在崩溃-这可能是因为您试图使用相同的
FragmentTransaction
来执行两个替换事务。尝试在每次执行替换和提交并取出实例成员变量时声明新变量。如果这不起作用,我看不到任何其他错误,你可能需要张贴你的logCat堆栈跟踪。我刚刚有机会检查它,它工作了。谢谢