在使用fragment的过程中老是会出现一些布局逻辑错乱的问题。相对于动态的replace()布局文件中的fragment,静态的添加进布局文件就感觉分外的简单。
我记录下了一些在代码中动态replace()出现的情况。
1.在水平布局中使用fragment。代码如下:
主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#333333"
android:id="@+id/linear_layout"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:id="@+id/tv"
android:textColor="#ffffff"
android:text="@string/hello_world" />
</LinearLayout>
fragment布局
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:background="#00333333"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="24dp"
android:text="22"
android:textColor="#000000" />
</RelativeLayout>
替换效果如下:
activity的代码如下:
public class LinearLayoutActivity extends FragmentActivity {
FragmentManager manager;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.linear_layout);
manager = getSupportFragmentManager();
findViewById(R.id.tv).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SecondFragment sec = new SecondFragment();
manager.beginTransaction()
.replace(R.id.linear_layout, sec).commit();
}
});
}
}
通过效果可以发现,fragment受到了水平布局的限制,居于第二行。
2.在framelayout里面的布局里使用:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frag_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#333333"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/hello_world"
android:textColor="#ffffff" />
</LinearLayout>
</FrameLayout>
代码和上面的错不多,如果replace()的是水平布局linear_layout的话,效果和上面是一样的。
如果replace()的是frag_layout的效果是
可以看到,两个层叠在一起。这符合framelayout的特性。
3.直接引用一个空的framelayout为fragment的容器:
fragment的容器
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frag_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
fragment的内容页同上面一样
activity的代码
public class MainActivity extends FragmentActivity {
FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = getSupportFragmentManager();
findViewById(R.id.tv).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FirstFragment first = new FirstFragment();
manager.beginTransaction()
.replace(R.id.frag_layout, first).commit();
}
});
findViewById(R.id.tv2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SecondFragment sec = new SecondFragment();
manager.beginTransaction()
.replace(R.id.frag_layout, sec).commit();
}
});
findViewById(R.id.tv3).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ThirdFragment third = new ThirdFragment();
manager.beginTransaction()
.replace(R.id.frag_layout, third).commit();
}
});
}
}
效果图:
没有出现层叠效果,然后我在这些布局中加入了背景色透明。效果还是这样。
总结:
fragment的动态引用需要一个framelayout作为容器。且里面不要放置其他布局,这样可以放置层叠效果。
当然其他布局也可以引用fragment,不过效果不是替换,而是在后面追加。
replace(int arg0, fragment)中的arg0必须是一个容器。