Как активность Android может получить доступ к экземпляру, если его текущее представление? - PullRequest
1 голос
/ 14 октября 2019

Как действие может получить доступ к экземпляру представления после того, как оно было установлено с помощью SetContentView? Мне это нужно, потому что в упражнении используется настраиваемое представление, включающее логику, и оно требуется для отправки событий в занятие через настраиваемый прослушиватель событий, который нужно установить в представлении.

Я программируюс андроид студией в котлине. Раньше у меня была вся логика управления пользовательским интерфейсом в действии, поэтому я был в порядке, но я настраиваю некоторый код пользовательского интерфейса в пользовательском представлении, чтобы повторно использовать его в нескольких действиях.

Вот инициализация действия

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.custom_view)

        // Here need to access the view instance
        *xxxxxxx*.setCustomViewListener(new CustomView.MyCustomViewListener() {
            @Override
            public void onCancelled() {
                // Code to handle cancellation from the view controls
            }
        });)
    }
}

Вот макет представления

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button android:id="@+id/button_do"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Do" />

    <com.kotlin.app.views.CustomView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/view_custom" />
</FrameLayout>

Вот класс пользовательского представления CustomView.kt

class CustomView : FrameLayout, View.OnClickListener {

    constructor(context: Context) : super(context)

    init {
    }

    interface CustomViewListener {
        fun onCancelled()
    }
    private var listener: CustomViewListener? = null

    fun setCustomViewListener(listener: CustomerViewListener) {
        this.listener = listener
    }

Любая идея, пожалуйста?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

В Kotlin более распространено использование синтетического Kotlin:

view_custom.setCustomViewListener(...)

Примечание: вы, кажется, написали свою реализацию слушателя на Java, а не на Kotlin. Так как ваш интерфейс определен в Kotlin, вам нужно что-то вроде этого:

view_custom.setCustomViewListener(object : CustomView.MyCustomViewListener {
    override fun onCancelled() {
        ...
    }
})

SAM интерфейсы в Kotlin

Лично мне нравится использовать лямбды. К сожалению, вы не можете использовать лямбду в качестве интерфейса SAM Kotlin. Однако вы можете использовать typealias вместо интерфейса:

typealias MyCustomerViewListener = () -> Void

Тогда вы можете использовать это вместо:

view_custom.setCustomViewListener {
    // listener code
}
1 голос
/ 14 октября 2019

Как действие может получить доступ к экземпляру представления после того, как оно было установлено с помощью SetContentView?

Шаг # 1: Добавьте атрибут android:id к корневому элементу <FrameLayout>.

Шаг # 2: В onCreate() вашей активности после setContentView()звоните, звоните findViewById(), чтобы получить FrameLayout на основе идентификатора, который вы назначили на шаге 1.

действие использует пользовательское представление, которое включает логику, и мне нужно, чтобы это представление было отправленособытия в мероприятии, через пользовательский прослушиватель событий, который нужно установить в представлении

. Вы также можете просто позвонить findViewById() и указать идентификатор пользовательского представления (findViewById(R.id.custom_view)).

Обратите внимание, что это освещено практически любой книгой по разработке приложений для Android.

...