web-dev-qa-db-ja.com

Kotlinを使用してランタイムマージンを任意のビューに設定する

私はコトリンの初心者です。この言語にあまり慣れていません。 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>

どうすれば続行できますか?

12
Chirag Solanki

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.

それが役に立てば幸い。

25
chandil03

これは私がコトリンでしたい方法です-

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)
13
Hitesh Gupta