首页 文章

Android:如何以编程方式设置布局的大小

提问于
浏览
123

作为Android应用程序的一部分,我正在构建一个按钮集 . 这些按钮是嵌套的LinearLayouts集的一部分 . 使用权重我根据包含父LinearLayout的大小自动调整自身大小 . 该想法是,基于屏幕的像素数和密度,将包含布局的大小设置为多个像素;并根据该更改让按钮设置自行调整大小 .

那么问题是:如何调整布局大小 .

我已经尝试了几种建议的技术,没有一种能够接近工作 . 以下是构建按钮集的XML的子集:

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

这两个问题是:1)如何从Java访问numberPadLayout . 一旦我可以访问视图,2)如何更改布局的高度和宽度 .

任何建议将不胜感激 .

4 回答

  • 2
    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);
    
  • 2

    这应该工作:

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

    如果要将dip转换为像素,请使用:

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

    我的示例代码

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

    您可以使用以下代码获取被调用布局的实际高度:

    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();
    }
    

相关问题