今天在看《第一行代码Android》第四章fragment的介绍,照着书上的例子写了一遍代码,可是发现了问题,在使用FragmentTransaction.replace()方法时不替换掉先前的Fragment,而是让之后的Fragment覆盖在之前的Fragment上。书上的代码大致如下:
MainActivity:
public class MainActivity extends Activity {
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button fragment_left=(Button) findViewById(R.id.leftbutton);
fragment_left.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AnotherFragmentRight fr=new AnotherFragmentRight();//获取待添加的fragment实例
FragmentManager fm=getFragmentManager();//获取到一个FragmentManger
FragmentTransaction ft=fm.beginTransaction();//开启一个事务
ft.replace(R.id.rightLayout, fr);
ft.addToBackStack(null);//将一个事务添加到一个返回栈中,按back键后返回到之前的fragment中
ft.commit();
}
});
}
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
tools:context="${relativePackage}.${activityClass}" >
<fragment
android:id="@+id/fragment_left"
android:name="com.example.fragmenttest.FragmentLeft"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/rightLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4" >
<fragment
android:id="@+id/fragment_right"
android:name="com.example.fragmenttest.FragmentRight"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
效果是这样的:图上两行字重叠在了一起
于是我检查了一遍代码,感觉与书上差别不大,后来在网上查了好久才找到问题所在。在activity_main.xml中,FrameLayout中不要加入Fragment,在代码中用FragmentTransaction.add()方法动态加入。代码如下:
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
tools:context="${relativePackage}.${activityClass}" >
<fragment
android:id="@+id/fragment_left"
android:name="com.example.fragmenttest.FragmentLeft"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/rightLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4" >
</FrameLayout>
</LinearLayout>
MainActivity:
public class MainActivity extends Activity {
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button fragment_left=(Button) findViewById(R.id.leftbutton);
FragmentRight fragment=new FragmentRight();
FragmentManager fm=getFragmentManager();//获取到一个FragmentManger
FragmentTransaction ft=fm.beginTransaction();//开启一个事务
ft.add(R.id.rightLayout, fragment);
ft.commit();
fragment_left.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
AnotherFragmentRight fr=new AnotherFragmentRight();//获取待添加的fragment实例
FragmentManager fm=getFragmentManager();//获取到一个FragmentManger
FragmentTransaction ft=fm.beginTransaction();//开启一个事务
ft.replace(R.id.rightLayout, fr);
ft.addToBackStack(null);//将一个事务添加到一个返回栈中,按back键后返回到之前的fragment中
ft.commit();
}
});
}
}
现在一切OK了,程序运行截图: