代码之家  ›  专栏  ›  技术社区  ›  user2875404

Android布局参数仅更改宽度和高度

  •  10
  • user2875404  · 技术社区  · 11 年前

    我知道如何使用 LayoutParams 通过执行以下操作:

    android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
    params.width = height/7;
    params.height = height/10;
    button.setLayoutParams(params);
    

    现在,只要我想将相同的高度和宽度应用于另一个按钮,我就需要创建另一个LayoutParams或覆盖现有的LayoutParams,如下所示:

    android.view.ViewGroup.LayoutParams params2 = but2.getLayoutParams();
    params2.width = height/7;
    params2.height = height/10;
    but2.setLayoutParams(params2);
    

    我的应用程序中有大约50个按钮,我怀疑它是否被认为是获得所有Params的好代码,以便只更改宽度和高度-我想保留剩余的Params(toLeftOf,[…])。

    是否有方法只更改参数的宽度和高度,但保留其余参数?所以它看起来像是:

    android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
    params.width = height/7;
    params.height = height/10;
    button.setLayoutParams(params);
    button2.setLayoutParams(params);
    button3.setLayoutParams(params);
    butt[...]
    

    提前非常感谢。

    6 回复  |  直到 11 年前
        1
  •  34
  •   Bartek Lipinski    11 年前

    使用方法的全部目的 getLayoutParams() 就是从一个 View (保留所有规则和东西)。然后可以修改这些参数的特定参数 LayoutParams 其余部分保持不变。因此,您 需要 呼叫 获取布局参数() 并修改返回的对象 Views xml中的设置不同。如果他们在xml中使用了完全相同的规则,您可以像上一个示例中所写的那样执行。

    我建议你做的只是做一个方法,它可以包裹整个更新过程 布局参数 。像这样:

    private void setDimensions(View view, int width, int height){
        android.view.ViewGroup.LayoutParams params = view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }
    

    这将大大简化您的代码,因为这样您就可以为每个按钮调用此方法,并使用适当的宽度和高度值。

    setDimensions(button, height/7, height/10);
    setDimensions(button2, height/7, height/10);
    setDimensions(button3, height/7, height/10);
    
        2
  •  5
  •   Pavel Shorokhov    8 年前

    在里面 科特林 我们可以做得更短更优雅:

    view.layoutParams = view.layoutParams.apply {
        width = LayoutParams.MATCH_PARENT
        height = LayoutParams.WRAP_CONTENT
    }
    
        3
  •  4
  •   M. Usman Khan    6 年前

    如果您只想更改一个参数:

    view.getLayoutParams().width = 400;
    view.requestLayout();
    
        4
  •  2
  •   Jolan Rensen    7 年前

    因为我还不能评论其他人: 我为Kotlin创建了一个小而优雅的扩展函数。

    fun <T: ViewGroup.LayoutParams>View.layoutParams(run: T.() -> Unit) {
        val params = layoutParams as T
        run(params)
        layoutParams = params
    }
    

    例如,constraintLayout中视图的用例如下:

    view.layoutParams<ConstraintLayout.LayoutParams> {
        width = LayoutParams.WRAP_CONTENT
        height = LayoutParams.WRAP_CONTENT
    }
    

    如果您不需要LayoutParams的特定实现(建议使用特定实现),则可以使用较小版本的扩展函数:

    fun View.layoutParams(run: ViewGroup.LayoutParams.() -> Unit) {
        val params = layoutParams
        run(params)
        layoutParams = params
    }
    

    ..这将导致:

    view.layoutParams {
        width = LayoutParams.WRAP_CONTENT
        height = LayoutParams.WRAP_CONTENT
    }
    
        5
  •  1
  •   aaaidan    8 年前

    正如其他答案所说:你需要 getLayoutParams() ,更改返回的LayoutParams对象,以及 setLayoutParams() (这是否是一个合理的API有待商榷)。

    但作为 通信1x Kotlin说,他可以让这本书变得简单易懂。

    这个怎么样:

    button.alterLayoutParams { 
        it.width = height / 7
        it.height = height / 10
    }
    

    这需要一个扩展函数:

    private fun View.alterLayoutParams(callback: ((ViewGroup.LayoutParams) -> Unit)) {
        val p = this.layoutParams
        callback(p)
        this.layoutParams = p
    }
    

    如果要将相同的布局参数应用于多个 View s、 您可以执行以下操作:

    listOf(button, button2, button3).forEach { b ->
        b.alterLayoutParams {
            it.width = height / 7
            it.height = height / 10
        }
    }
    

    PS.Kotlin简直太棒了。

        6
  •  0
  •   Tatsuya Fujisaki    5 年前
    view.updateLayoutParams {
        width = LayoutParams.WRAP_CONTENT
        height = LayoutParams.WRAP_CONTENT
    }