近日在开发过程中被控件的居中问题搞得焦头烂额,所以打算写篇博客记录一下
我在程序中使用ActivityGroup实现程序的仿iPhone Tab界面,将打开的其他Activity显示在布局的一个RelativeLayout中,,但是出现了打开的Activity中的控件无法在RelativeLayout中居中显示。
我们先看一下ActivityGroup的layout
<!-- 此处为ActivityGroup的layout --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- 顶部标题栏 --> <LinearLayout android:id="@+id/mainHeadView" android:layout_width="fill_parent" android:layout_height="50dp" android:background="@drawable/main_head_bg" android:gravity="center_vertical" android:orientation="vertical" android:layout_gravity="top" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="标题" android:textSize="20dp" /> </LinearLayout> <!-- 中间显示区域 --> <!-- 这里便是用于显示其他Activity的View的RelativeLayout --> <RelativeLayout android:id="@+id/mainBodyView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" > </RelativeLayout> <!-- 下端选择指示区域 --> <LinearLayout android:id="@+id/mainBottomView" android:layout_width="fill_parent" android:layout_height="55dp" android:background="#ddd" android:weightSum="5" android:layout_gravity="bottom" android:orientation="horizontal" > <!-- 无关项,因排版需求省略 --> </LinearLayout> </LinearLayout>
然后看一下我们需要打开的Activity的layout,注意这里我已经设置了RelativeLayout的fill_parent
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ProgressBar android:id="@+id/loadFriendsPrgsBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <TextView android:id="@+id/loadFriendsError" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="加载失败" android:textSize="14dp" android:visibility="gone" /> <ListView android:id="@+id/friendsListView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentTop="true" android:visibility="gone" > </ListView> </RelativeLayout>
开始时,我再ActivityGroup中打开Activity的代码是这样的
bodyView.addView(getLocalActivityManager() .startActivity("FriendsListActivity", new Intent(OriMainActivity.this, FriendsListActivity.class)) .getDecorView());
这段代码的意思是打开一个Activity,然后获取这个Activity上网View,添加到上面给出的ActivityGroup布局中的指定Layout中
开始以为这样便是没有问题,但是显示出来的结果并不是居中,而是在左上角
调试后发现,原来是从打开的Activity获取到的View并没有fill_parent,而是wrap_content了
所以这是我们应该在代码中对其进行设置,使用LayoutParams
这是改进后的代开Activity的代码
View friendView = getLocalActivityManager() .startActivity("FriendsListActivity", new Intent(OriMainActivity.this, FriendsListActivity.class)) .getDecorView(); addFillParams(friendView); bodyView.addView(friendView);
这样一来从打开的Activity获取的View便可以填充在ActivityGroup的Layout中的RelativeLayout中了
当然,Activity中的控件也可以居中了
以下是一些个人走的弯路,以作警示:
1、LinearLayout的子控件居中问题
如果LinearLayout的orientation属性为vertical,那么子空间的layout_gravity可起作用的只有和horizontal有关的(center_horizontal等)。
同理,LinearLayout的orientation属性为horizontal,那么子空间的layout_gravity可起作用的只有和vertical有关的(center_vertical等)。
如果要想使LinearLayout的子控件居中,那么便可以设置LinearLayout的gravity属性为center,这样便可以在父容器设置子控件的位置,
但这样一来子控件的layout_gravity便不再起作用
2、RelativeLayout的子控件居中问题
开始我尝试在子控件中设置layout_gravity=center,但是却没有得到应该的布局
后来经过尝试,发现使用android:layout_centerInParent="true"可以达到目的
(RelativeLayout中有很多类似于layout_centerInParent的自有属性,通过这些属性可以替代layout_gravity)