我的代码遇到了问题。
我想要什么
我的活动自动开始使用Fragment01。 在Fragment01上,有一个按钮,它应该用Fragment02替换Fragment01
会发生什么
当我按下按钮而不是替换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>
答案 0 :(得分:1)
您的布局XML中的fragment
元素只能引用该单个片段,并且无法以您想要的方式进行换出。相反,您需要完全从布局XML中删除fragment
元素,并将Fragment01
添加到活动FrameLayout
方法代码中的容器onCreate()
中。
所以,删除fragment
元素,就像这样;
<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>
然后,您可以在onCreate()
覆盖的开头执行交易,就像这样;
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
transaction.replace(R.id.button_fragment_container, new Fragment01());
transaction.commit();
您需要为每个新交易实例化一个新的FragmentTransaction
,这意味着您可能希望从您的实例成员中删除FragmentManager
和FragmentTransaction
并声明它们每次需要进行片段事务时都要新鲜。
我希望这会有所帮助。
进一步阅读:
答案 1 :(得分:1)
将beginTransaction置于onclick函数中,并将R.id.button_fragment_container替换为R.id.frame_container。
使用内部onclick:
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, new Fragment02()).commit();
xml文件中的片段不正确。擦除那部分。
答案 2 :(得分:1)
试试这段代码:
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment01, new Fragment02());
fragmentTransaction.commit();
另外,在xml中将'fragment'更改为'FrameLayout'。这可以防止任何一个片段始终保留在后台。
答案 3 :(得分:1)
一步一步走:
首先修改你的布局,删除那里的片段并在活动中引用你的FrameLayout。
现在启动您要添加到framelayout的片段类,并调用以下代码:
FragmentTransaction transaction = manager.beginTransaction();
transaction.remove(removePreviousFragmentIfAny);
transaction.add(R.id.button_fragment_container, newFragment);
transaction.commit();
希望它会帮助你完成。