2011-06-08 83 views
3

给定下面的main.xml布局,是否可以在运行时更改FrameLayout的“layout_gravity”,并立即显示结果?动态重新定位布局

我的主要布局是一个LinearLayout和一个居中的FrameLayout子项,有两个子项,一个SurfaceView和一个ImageView(位于框架布局的底部)。

我有一个菜单,让用户可以选择重新定位框架布局,这应该通过将layout_gravity更改为“顶部”,“底部”或“中心”来完成。

为了做到这一点,我用这个代码在运行时改变重力:

int mGravity = Gravity.TOP // gravity determined from menu selection 
FrameLayout mFrameLayout = (FrameLayout)findViewById(R.id.my_framelayout); 
((LinearLayout.LayoutParams) mFrameLayout.getLayoutParams()).gravity = mGravity; 

然而,这并不能立即工作。我只有在用户点击其他菜单项后才能开始工作,这会将他们带到Android Market。当用户退出市场并返回到我的应用程序时,才根据用户以前选择的内容绘制新布局。

我是否缺少一些简单的东西?如何在用户选择位置后强制重新绘制?我应该失效什么?

的main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/ll_main" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<FrameLayout 
    android:id="@+id/my_framelayout" 
    android:layout_width="fill_parent" 
    android:layout_height="@dimen/surfaceview_default_h" 
    android:layout_gravity="center"> 

    <SurfaceView 
     android:id="@+id/my_surfaceview" 
     android:layout_width="@dimen/surfaceview_default_w" 
     android:layout_height="@dimen/surfaceview_default_h">   
    </SurfaceView> 

    <ImageView 
     android:id="@+id/my_imageview" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:src="@drawable/someimage" 
     android:layout_gravity="bottom"> 
    </ImageView> 

</FrameLayout> 
</LinearLayout> 

menu.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:id="@+id/mnu_position" 
    android:title="@string/position"> 
    <!-- Position submenu --> 
    <menu> 
     <group 
      android:id="@+id/grp_position" 
      android:menuCategory="container" 
      android:checkableBehavior="single"> 
      <item 
       android:id="@+id/mnu_position_top" 
       android:title="@string/top"> 
      </item> 
      <item 
       android:id="@+id/mnu_position_center" 
       android:title="@string/center" 
       android:checked="true"> 
      </item> 
      <item 
       android:id="@+id/mnu_position_bottom" 
       android:title="@string/bottom"> 
      </item> 
     </group> 
    </menu> 
</item> 
<item 
    android:id="@+id/mnu_android_market" 
    android:title="@string/market"> 
</item> 
</menu> 

回答

0

尝试添加

mFrameLayout.invalidate(); 

您设置的严重性后。

+0

感谢您的建议,但不幸的是没有效果。但是我发现,如果我在设置重力之后在主LinearLayout(ll_main)上执行setBackgroundColor(),则会相应地更新FrameLayout位置。但它只会做一次。如果我直接返回菜单并选择其他位置,即使再次运行setBackgroundColor(),也无法重新定位。 – Jason 2011-06-08 13:20:03