Android ViewBinding с CustomView - PullRequest
       8

Android ViewBinding с CustomView

3 голосов
/ 27 февраля 2020

Я хотел бы использовать опцию ViewBinding с настраиваемым представлением, например:

MainActivity <=> layout_main.xml
MyCustomView <=> layout_my_custom_view.xml

layout_main. xml

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.myapplication.MyCustomView
            android:id="@+id/custom_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</FrameLayout>

layout_my_custom_view. xml

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/line1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Line1" />

        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#2389bb" />

        <TextView
            android:id="@+id/line2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Line2" />
</LinearLayout>

MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var binding: LayoutMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = LayoutMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.customView.line1.text = "Hello"
        binding.customView.line2.text = "World"
    }
}

В моей функции MainActivity я могу использовать привязку для поиска MyCustomView, но не могу в дальнейшем найти @id/line1 и @id/line2 в MyCustomView. В этом случае возможно ли использовать только ViewBinding или мне нужно использовать findViewById или Kotlin syntheti c ??

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 27 февраля 2020

ViewDataBinding.inflate не генерирует элемент доступа дочернего вида в пользовательском представлении.

, таким образом, вы не можете коснуться line1 (TextView) только при использовании ViewDataBinding.

Если вы не хотите использовать findViewById или kotlin synthetic, MyCustomView также необходимо применить ViewDataBinding. попробуйте, как показано ниже.

CustomView

class MyCustomView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
    private val binding =
        CustomLayoutBinding.inflate(LayoutInflater.from(context), this, true)

    val line1
        get() = binding.line1

    val line2
        get() = binding.line2
}

MainActivity

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
    setContentView(binding.root)

    with(binding.customView) {
        line1.text = "Hello"
        line2.text = "World"
    }
}
0 голосов
/ 27 февраля 2020

Я полагаю, что вы можете установить сеттер в своем пользовательском представлении. Поскольку ViewBinding генерирует класс привязки для вашего основного макета, он должен вернуть вам класс CustomView. Таким образом, вы можете использовать только что созданный сеттер для изменения текстов.

0 голосов
/ 27 февраля 2020

Возможно ли вам поделиться своим классом MainActivity?

Как вы пытаетесь ссылаться на представления?

В идеале у вас должна быть возможность ссылаться на / открывать виды, используя findViewById или Kotlin synthetic.

...