`
king_tt
  • 浏览: 2258724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解决Android使用ActivityGroup打开Activity后控件无法居中问题

 
阅读更多

近日在开发过程中被控件的居中问题搞得焦头烂额,所以打算写篇博客记录一下

我在程序中使用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)


分享到:
评论

相关推荐

    使用ActivityGroup管理Activity

    - 兼容性问题:由于`ActivityGroup`在API 11后被弃用,对于支持新版本Android系统的应用来说,使用`ActivityGroup`可能会导致兼容性问题。 - 生命周期管理:`ActivityGroup`管理的子Activity生命周期可能会变得复杂...

    Android开发—使用ActivityGroup来切换Activity和Layout

    Android 开发—使用 ActivityGroup 来切换 Activity 和 Layout Android 开发中,经常需要在不同的 Activity 之间进行切换,并且显示不同的ContentView。为了实现这个功能,我们可以使用 ActivityGroup 来管理不同...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    在Android开发中,ActivityGroup是一种特殊类型的Activity,它允许开发者在一个Activity内嵌套其他Activity,实现类似TabHost或Fragment的效果,但这是在Android早期版本(API级别较低)中的一种实现方式。...

    使用ActivityGroup来切换Activity和Layout

    在这种情况下,通常我们会选择使用TabHost或者Fragment等组件来实现,但如果你正在使用的是Android早期版本(API Level ),`ActivityGroup`是一个可行的选择。`ActivityGroup`是`TabActivity`的一种替代方案,它...

    用ActivityGroup解决TabHost中多个Activity跳转问题

    Fragment可以像Activity一样拥有自己的UI和生命周期,而且可以在同一个Activity中进行动态添加、删除和替换,解决了ActivityGroup的一些问题,同时也更符合Android设计原则。 在升级到使用Fragment时,需要注意以下...

    android ActivityGroup的demo

    首先,ActivityGroup是Android早期版本(API Level 10及以下)提供的一种解决方案,用于实现在一个Activity中展示多个子Activity的效果。然而,自Android 3.0(API Level 11)起,官方推荐使用Fragment替代...

    ActivityGroup之activity内跳转和外跳转

    ActivityGroup是一种旧版的Android实现,它允许在一个Activity中嵌套多个子Activity,这在早期版本的Android系统中常用于实现类似TabHost的效果。然而,自Android 3.0(API级别11)起,Android引入了Fragment的概念...

    ActivityGroup之Activity内跳转和外跳转

    ActivityGroup是早期Android SDK中的一个特殊类型,它允许在一个Activity中嵌套多个子Activity,形成类似TabHost或者多窗口的效果。然而,从Android 3.0(API级别11)开始,ActivityGroup被废弃,推荐使用Fragment来...

    ActivityGroup和ViewPager组合实现微信模仿

    然而,由于它存在一些局限性和问题,如内存泄漏和生命周期管理复杂,从Android 3.0(API级别11)开始,官方推荐使用Fragment替代ActivityGroup。尽管如此,在某些场景下,开发者可能仍会使用ActivityGroup来实现特定...

    Android中ActivityGroup的应用

    ActivityGroup的用法,头部和...至于在Android在ActivityGroup里执行跳转详细介绍 请到我百度空间查看。运行效果也在下面地址可以看到。 http://hi.baidu.com/qinxiaowei137/blog/item/32a3761703ba6febc3ce798b.html

    tabhost和ActivityGroup的组合使用

    在实际项目中,我们可以将TabHost和Fragment结合使用,每个标签页都包含一个Fragment容器,然后在Fragment之间进行切换,这样既能实现动态内容加载,又能避免因使用ActivityGroup带来的潜在问题。对于旧项目改造,...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    "Android Gallery+ActivityGroup实现滑动TAB独立Activity"是一种早期的Android开发技术,虽然现在已经被更先进的Fragment所取代,但理解这一模式对于理解Android应用的演化历程以及如何处理旧代码库中的遗留问题仍然...

    Android之ActivityGroup实现Tab分页标签

    总结起来,虽然ActivityGroup在现代Android开发中已经不再推荐使用,但理解其工作原理有助于我们更好地掌握Android的Activity管理机制。在实际开发中,我们应该优先考虑使用Fragment和ViewPager等组件来实现Tab分页...

    android activitygroup底部菜单

    在Android应用开发中,ActivityGroup是一种特殊的容器,它允许在一个栈结构中管理多个子Activity,常见于早期...理解并掌握ActivityGroup的使用,可以帮助开发者更好地理解和解决老版本Android应用中的导航问题。

    Android项目ActivityGroup + GridView + ViewFlipper 实现选项卡.rar

    Android项目ActivityGroup + GridView + ViewFlipper 实现选项卡 本项目是一个基于Android平台的应用程序,它实现了选项卡功能。通过结合ActivityGroup、GridView和ViewFlipper组件,我们能够创建一个流畅、直观的...

    activitygroup

    `ActivityGroup`在早期的Android版本中被用来解决在同一个栈内管理多个`Activity`的需求,但在Android 3.0(API Level 11)之后,官方推荐使用`Fragment`来替代,因为`Fragment`提供了更灵活且性能更好的解决方案。...

    ActivityGroup应用实例

    在Android开发中,ActivityGroup是一种特殊的Activity类型,它允许开发者在一个Activity中嵌套其他Activity,形成多层级的界面结构。这个“ActivityGroup应用实例”应该是一个详细的教程,旨在帮助开发者理解如何...

    ActivityGroup实现Activit栈

    在Android开发中,ActivityGroup是早些版本API中提供的一种特殊类型的Activity,它允许开发者在一个TabHost或者帧布局(FrameLayout)中嵌套多个Activity,从而实现类似iOS中UINavigationController的堆叠管理器效果...

    AndroidTabHost内嵌ActivityGroup界面管理源码.zip

    5. 添加子Activity:在ActivityGroup中,通过LocalActivityManager的startActivity()方法添加子Activity,并使用addWindow()方法将其添加到ActivityGroup的窗口栈中。 6. 在ActivityGroup中切换子Activity:根据...

    Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.7z

    总结来说,虽然现代Android开发倾向于使用Fragment替代ActivityGroup,但理解TabHost和ActivityGroup的历史以及它们的工作方式对于深入学习Android系统和历史演进非常重要。通过对"Android TabHost内嵌ActivityGroup...

Global site tag (gtag.js) - Google Analytics