2011-07-23 13 views
102

Como parte de una aplicación para Android, estoy creando un conjunto de botones. Los botones son parte de un conjunto anidado de LinearLayouts. Utilizando el peso, tengo el ajuste del tamaño automáticamente en función del tamaño del elemento principal lineal LinearLayout. La idea es, en función del número de píxeles y la densidad de la pantalla, establecer el tamaño del diseño que lo contiene en varios píxeles; y hacer que el botón se ajuste el tamaño según ese cambio.Android: Cómo establecer programáticamente el tamaño de un diseño

La pregunta es: cómo cambiar el tamaño del diseño.

He intentado varias técnicas sugeridas, y ninguna está cerca de funcionar. Aquí es un subconjunto del XML que construye el conjunto de botones:

<LinearLayout android:layout_height="104pt" android:id="@+id/numberPadLayout" android:orientation="horizontal" android:layout_width="104pt" 
    android:background="#a0a0a0" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
> 

    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_width="wrap_content"> 
     <Button android:text="1" android:id="@+id/button1" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="4" android:id="@+id/button4" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="7" android:id="@+id/button7" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="-" android:id="@+id/buttonDash" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
    </LinearLayout> 
    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout2" android:orientation="vertical" android:layout_width="wrap_content"> 
     <Button android:text="2" android:id="@+id/button2" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="5" android:id="@+id/button5" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="8" android:id="@+id/button8" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="0" android:id="@+id/button0" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
    </LinearLayout> 

    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout3" android:orientation="vertical" android:layout_width="wrap_content"> 
     <Button android:text="3" android:id="@+id/button3" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="6" android:id="@+id/button6" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="9" android:id="@+id/button9" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="." android:id="@+id/buttonDot" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
    </LinearLayout> 
    <LinearLayout android:layout_weight="2" android:layout_height="fill_parent" android:id="@+id/linearLayout4" android:orientation="vertical" android:layout_width="wrap_content"> 
     <Button android:text="/" android:id="@+id/buttonBack" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
     <Button android:text="\" android:id="@+id/buttonEnter" android:layout_weight="2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> 
    </LinearLayout> 

</LinearLayout>  

Las dos preguntas son: 1) ¿cómo puedo obtener acceso a numberPadLayout desde Java. Y una vez que tengo acceso a la vista, 2) cómo cambio la altura y el ancho del diseño.

Cualquier sugerencia será apreciada.

Respuesta

294

Esto debería funcionar:

// Gets linearlayout 
LinearLayout layout = findViewById(R.id.numberPadLayout); 
// Gets the layout params that will allow you to resize the layout 
LayoutParams params = layout.getLayoutParams(); 
// Changes the height and width to the specified *pixels* 
params.height = 100; 
params.width = 100; 
layout.setLayoutParams(params); 

Si desea convertir inmersión a píxeles, utilice esto:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics()); 
+8

Gracias, eso era exactamente lo que necesitaba. Parece que me he equivocado al asumir que necesitaría volver a aplicar los parámetros al diseño para que funcione. – codingCat

+1

Combine esto con http://stackoverflow.com/a/8171014/9648 si necesita cambiar en función de los valores calculados de otras Vistas. – JohnnyLambada

+1

No funciona. El ancho de mi diseño es 2000. Cuando imprimo 'layout.getWidth()', sigue siendo 2000 aunque puse 'params.width = 1000' –

44

mi código de ejemplo

wv = (WebView) findViewById(R.id.mywebview); 
wv.getLayoutParams().height = LayoutParams.MATCH_PARENT; // LayoutParams: android.view.ViewGroup.LayoutParams 
// wv.getLayoutParams().height = LayoutParams.WRAP_CONTENT; 
wv.requestLayout();//It is necesary to refresh the screen 
+0

El uso de WebView huele como si lo usara en aplicaciones cordova, ¿verdad? –

2

, usted puede obtener la altura real del llamado diseño con este código:

public int getLayoutSize() { 
// Get the layout id 
    final LinearLayout root = (LinearLayout) findViewById(R.id.mainroot); 
    final AtomicInteger layoutHeight = new AtomicInteger(); 

    root.post(new Runnable() { 
    public void run() { 
     Rect rect = new Rect(); 
     Window win = getWindow(); // Get the Window 
       win.getDecorView().getWindowVisibleDisplayFrame(rect); 

       // Get the height of Status Bar 
       int statusBarHeight = rect.top; 

       // Get the height occupied by the decoration contents 
       int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 

       // Calculate titleBarHeight by deducting statusBarHeight from contentViewTop 
       int titleBarHeight = contentViewTop - statusBarHeight; 
       Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop); 

       // By now we got the height of titleBar & statusBar 
       // Now lets get the screen size 
       DisplayMetrics metrics = new DisplayMetrics(); 
       getWindowManager().getDefaultDisplay().getMetrics(metrics); 
       int screenHeight = metrics.heightPixels; 
       int screenWidth = metrics.widthPixels; 
       Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth); 

       // Now calculate the height that our layout can be set 
       // If you know that your application doesn't have statusBar added, then don't add here also. Same applies to application bar also 
       layoutHeight.set(screenHeight - (titleBarHeight + statusBarHeight)); 
       Log.i("MY", "Layout Height = " + layoutHeight); 

      // Lastly, set the height of the layout  
      FrameLayout.LayoutParams rootParams = (FrameLayout.LayoutParams)root.getLayoutParams(); 
      rootParams.height = layoutHeight.get(); 
      root.setLayoutParams(rootParams); 
     } 
    }); 

return layoutHeight.get(); 
} 
0
LinearLayout YOUR_LinearLayout =(LinearLayout)findViewById(R.id.YOUR_LinearLayout) 
    LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
         /*width*/ ViewGroup.LayoutParams.MATCH_PARENT, 
       /*height*/ 100, 
       /*weight*/ 1.0f 
       ); 
       YOUR_LinearLayout.setLayoutParams(param); 
Cuestiones relacionadas