2011-07-23 14 views
102

Come parte di un'app Android, sto creando un set di pulsanti. I pulsanti fanno parte di un insieme annidato di LinearLayouts. Usando il peso ho il set che si ridimensiona automaticamente in base alla dimensione del LinearLayout genitore che contiene. L'idea è, in base al numero di pixel e alla densità dello schermo, di impostare la dimensione del layout contenente su un numero di pixel; e il set di pulsanti si ridimensiona in base a tale modifica.Android: Come impostare la dimensione di un layout a livello di programmazione

La domanda è quindi: come ridimensionare il layout.

Ho provato diverse tecniche suggerite e nessuna si avvicina al lavoro. Qui è un sottoinsieme di XML che costruisce il pulsante SET:

<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>  

Le due domande sono: 1) come ottengo l'accesso a numberPadLayout da Java. E una volta che ho accesso alla vista, 2) come cambio l'altezza e la larghezza del layout.

Qualsiasi suggerimento sarà apprezzato.

risposta

294

Questo dovrebbe funzionare:

// 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); 

Se si desidera convertire tuffo per pixel, utilizzare questo:

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

Grazie, era esattamente ciò di cui avevo bisogno. Mi sembra che sia andato storto nel presupposto che avrei dovuto applicare i parametri al layout per farlo funzionare. – codingCat

+1

Combina questo con http://stackoverflow.com/a/8171014/9648 se è necessario modificare in base ai valori calcolati di altre viste. – JohnnyLambada

+1

Non funziona. La larghezza del mio layout è 2000. Quando stampo 'layout.getWidth()', è ancora 2000 anche se inserisco 'params.width = 1000' –

44

il mio codice di esempio

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

L'uso di WebView odora come se lo si utilizza nelle app cordova, giusto? –

2

è possibile ottenere l'altezza effettiva di layout chiamato con questo codice:

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); 
Problemi correlati