2011-06-08 2 views
3

Étant donné la disposition main.xml ci-dessous, est-il possible de modifier la "layout_gravity" du FrameLayout à l'exécution avec le résultat affiché immédiatement?Repositionner la mise en page à la volée

Ma disposition principale est un LinearLayout et un enfant FrameLayout centré avec deux enfants, un SurfaceView et un ImageView (positionné en bas de la disposition du cadre).

J'ai un menu, qui donne à l'utilisateur la possibilité de repositionner la disposition des cadres, ce qui devrait être fait en changeant layout_gravity en "top", "bottom", ou "center".

Pour ce faire, j'utiliser ce code pour changer la gravité lors de l'exécution:

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

Cependant, cela ne fonctionne pas immédiatement. Je l'ai seulement obtenu au travail après que l'utilisateur clique sur l'autre élément de menu, qui les amène à l'Android Market. Lorsque l'utilisateur revient du marché et retourne à mon application, seule la nouvelle disposition est dessinée en fonction de ce que l'utilisateur a précédemment sélectionné.

Ai-je oublié quelque chose de simple? Comment puis-je forcer un redraw juste après que l'utilisateur sélectionne la position? Que devrais-je invalider?

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> 

Répondre

0

essayer d'ajouter

mFrameLayout.invalidate(); 

après avoir défini la gravité.

+0

Merci pour la suggestion, mais malheureusement cela n'a eu aucun effet. J'ai cependant découvert que si je fais un setBackgroundColor() sur le LinearLayout principal (ll_main) juste après avoir réglé la gravité, il met à jour la position FrameLayout en conséquence. Mais cela ne le fera qu'une seule fois. Si je retourne tout de suite dans le menu et sélectionne une position différente, elle ne peut pas être repositionnée, même si setBackgroundColor() est à nouveau exécuté. – Jason

Questions connexes