【问题标题】:Set runtime margin to any view using Kotlin使用 Kotlin 将运行时边距设置为任何视图
【发布时间】:2017-07-31 09:06:50
【问题描述】:

我是 Kotlin 的初学者。我对这门语言不太熟悉。我正在制作一个示例并使用代码。我只想将运行时边距设置为任何视图。我也尝试用谷歌搜索,但没有得到任何合适的解决方案。

要求

将运行时边距设置为任何视图。

说明

我有一个包含在 Button 上的 xml 文件,我想为此按钮设置运行时边距。

代码

我也尝试过下面的事情,但它不起作用。

class MainActivity : AppCompatActivity() {


//private lateinit var btnClickMe: Button
//var btnClickMe=Button();

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //For setting runtime text to any view.
        btnClickMe.text = "Chirag"

        //For getting runtime text to any view
        var str: String = btnClickMe.text as String;

        //For setting runtimer drawable
       btnClickMe.background=ContextCompat.getDrawable(this,R.drawable.abc_ab_share_pack_mtrl_alpha)//this.getDrawable(R.drawable.abc_ab_share_pack_mtrl_alpha)


        /*
        //For Setting Runtime Margine to any view.
        var param:GridLayout.LayoutParams
        param.setMargins(10,10,10,10);

        btnClickMe.left=10;
        btnClickMe.right=10;
        btnClickMe.top=10;
        btnClickMe.bottom=10;
        */

        // Set OnClick Listener.
        btnClickMe.setOnClickListener {
            Toast.makeText(this,str,5000).show();
        }

    }

}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
tools:context="chirag.iblazing.com.stackoverflowapp.MainActivity"
android:layout_height="match_parent">

<Button
    android:id="@+id/btnClickMe"
    android:text="Click Me"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

我该如何继续?

【问题讨论】:

  • 你能发布你的activity_main.xml吗?
  • 请检查更新 @chandil03 我也尝试使用 LinearLayoutParam 进行同样的操作,但它不起作用。
  • 正如我在您的评论部分看到的,这不是我们应该如何使用 LayoutParams。检查答案。

标签: android button kotlin


【解决方案1】:

您需要从按钮获取layoutParams 对象并将其转换为ViewGroup.MarginLayoutParams(这是LinearLayout.LayoutParamsRelativeLayout.LayoutParams 和其他人的parent class,您不必检查哪个是@987654326 @ 的实际父级)并将边距设置为您想要的任何值。

检查以下代码:

val param = btnClickMe.layoutParams as ViewGroup.MarginLayoutParams
param.setMargins(10,10,10,10)
btnClickMe.layoutParams = param // Tested!! - You need this line for the params to be applied.

希望对你有帮助。

【讨论】:

  • Wooow 工作正常。谢谢兄弟。已接受回答
  • var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT).also { it.setMargins(10, 10, 10, 10) }
  • 出现错误,无法转换“android.view.ViewGroup$LayoutParams 无法转换为 android.view.ViewGroup$MarginLayoutParams”
【解决方案2】:

这就是我想在 Kotlin 中做的事情 -

fun View.margin(left: Float? = null, top: Float? = null, right: Float? = null, bottom: Float? = null) {
    layoutParams<ViewGroup.MarginLayoutParams> {
        left?.run { leftMargin = dpToPx(this) }
        top?.run { topMargin = dpToPx(this) }
        right?.run { rightMargin = dpToPx(this) }
        bottom?.run { bottomMargin = dpToPx(this) }
    }
}

inline fun <reified T : ViewGroup.LayoutParams> View.layoutParams(block: T.() -> Unit) {
    if (layoutParams is T) block(layoutParams as T)
}

fun View.dpToPx(dp: Float): Int = context.dpToPx(dp)
fun Context.dpToPx(dp: Float): Int = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).toInt()

现在我们只需要在像这样的视图上调用它

textView.margin(left = 16F)

【讨论】:

  • 这些超级有用!
【解决方案3】:

这是一个有用的 Kotlin 扩展方法:

fun View.setMargins(
    left: Int = this.marginLeft,
    top: Int = this.marginTop,
    right: Int = this.marginRight,
    bottom: Int = this.marginBottom,
) {
    layoutParams = (layoutParams as ViewGroup.MarginLayoutParams).apply {
        setMargins(left, top, right, bottom)
    }
}

像这样使用它:

myView.setMargins(
   top = someOtherView.height
   bottom = anotherView.height
)

编辑:解决方案类似于the answer from Hitesh,但我使用的是(原始)ViewGroup.setMargins(以像素为单位)。当然,您可以根据这些示例制作自己的 setMarginsDp 变体,或者在调用我的实现之前使用 Hitesh 的 dpToPx 扩展。您选择哪种解决方案取决于您自己的口味。

另请注意,我的解决方案(重新)设置了所有边距,尽管在大多数情况下这不会成为问题。

【讨论】:

    【解决方案4】:

    这是 CardView

    的另一个示例
                myCardView.elevation = 0F
                myCardView.radius = 0F
                val param = (myCardView.layoutParams as ViewGroup.MarginLayoutParams).apply {
                    setMargins(0,0,0,0)
                }
                myCardView.layoutParams = param
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      相关资源
      最近更新 更多