私はコトリンの初心者です。この言語にあまり慣れていません。 1つの例を作成し、コードで遊んでいます。ランタイムマージンを任意のビューに設定したいだけです。私もそれをグーグルしようとしていますが、このタスクのための適切な解決策を得ていません。
要件
ランタイムマージンを任意のビューに設定します。
説明
ボタンに含まれている1つの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>
どうすれば続行できますか?
layoutParams
の親はbtnClickMe
であるため、ボタンからLinearLayout
オブジェクトをLinearLayout.LayoutParams
にキャストし、必要に応じてマージンを設定する必要があります。
次のコードを確認してください:
val param = btnClickMe.layoutParams as LinearLayout.LayoutParams
param.setMargins(10,10,10,10)
btnClickMe.layoutParams = param // Tested!! - You need this line for the params to be applied.
それが役に立てば幸い。
これは私がコトリンでしたい方法です-
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)