web-dev-qa-db-ja.com

Kotlin Android Extensionsを使用してプログラムで膨らんだレイアウト

私は次のレイアウトを持っています:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:background="@Android:color/white"
    Android:paddingLeft="20dp"
    Android:paddingRight="20dp">

    <TextView
        Android:id="@+id/tvErrorTitle"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp"
        Android:textColor="@Android:color/background_dark"
        Android:textSize="18sp"
        />
    <TextView
        Android:id="@+id/tvErrorDesc"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="30dp"
        Android:textColor="@Android:color/darker_gray"
        Android:textSize="16sp"
        />
    <TextView
        Android:id="@+id/tvAction"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="30dp"
        Android:layout_marginBottom="10dp"
        Android:layout_gravity="end"
        Android:padding="5dp"
        Android:textSize="15sp"
        Android:textStyle="bold"
        Android:textAllCaps="true"
        Android:textColor="@Android:color/holo_purple"
        />
</LinearLayout>

以下のようなアクティビティ以外で kotlin Android extensions を使用したい場合、機能しません。最終的にfindViewByIdを実行しました。

...
...
import kotlinx.Android.synthetic.main.dialog_error.*
...
...
 val view = LayoutInflater.from(context).inflate(R.layout.dialog_error, null, false)
    val tvErrorTitle = view.findViewById(R.id.tvErrorTitle) as TextView
    val tvErrorDesc = view.findViewById(R.id.tvErrorDesc) as TextView
    val tvErrorAction = view.findViewById(R.id.tvAction) as TextView

ビューをxmlから直接プルすることはありません。プログラム的に膨らんだレイアウトでそれを使用してfindViewByIdを避ける方法は?

:この質問は厳密には Kotlin Android Extensions に属し、言語そのものではありません。

Edit両方をインポートしました:

import kotlinx.Android.synthetic.main.dialog_error.view.*
import kotlinx.Android.synthetic.main.dialog_error.*

しかしAndroid StudioはR.idからのインポートを試みますが、これら2つのインポートを認識しません。不足しているものはありますか?

11
Krupal Shah

リンクしたドキュメント から:

Viewで合成プロパティを呼び出したい場合(アダプタークラスで有用)、インポートする必要があります

kotlinx.Android.synthetic.main.activity_main.view.*.

つまり、インポートkotlinx.Android.synthetic.main.layout.view.*同様に、View拡張プロパティをロードします。

次に:

val view = LayoutInflater.from(context).inflate(...)
view.tvErrorTitle.text = "test"
30
nhaarman

膨張したビューを返します。

layoutInflater.inflate(R.layout.your_layout, null)

クラスをContextスーパークラスから拡張する場合、このLayoutInflater.from(context)をこのlayoutInflaterに置き換えることができます

1
Lucas B.