Как получить текущий объект веб-просмотра в Android?

Я использую Datadog для отслеживания активности пользователей в своем приложении. Теперь мне нужно настроить веб-просмотры. После инициализации sdk datadog в его документации сказано, что я должен вызвать следующий фрагмент кода:

DatadogEventBridge.setup(webView)

то есть я должен вызвать настройку статического метода и передать ему объект WebView. Но проблема в том, что в моем приложении много таких объектов (много веб-просмотров). Должен ли я помещать этот код в каждый класс, у которого есть атрибут WebView? Или можно каким-то образом использовать функцию обратного вызова, которая вызывается всякий раз, когда создается веб-просмотр, в этом обратном вызове я бы назвал DatadogEventBridge.setup(webView)?

Я попытался использовать обратные вызовы жизненного цикла, а затем получил Activity для каждого метода onResume, чтобы проверить, есть ли у этого действия веб-просмотр. Но все пошло не так.

«Или возможно каким-то образом использовать функцию обратного вызова, которая вызывается всякий раз, когда создается веб-просмотр» - извините, такого обратного вызова нет. «Но что-то пошло не так» — без минимального воспроизводимого примера мы не сможем вам помочь с этой проблемой. «Но проблема в том, что в моем приложении есть много таких объектов (много веб-просмотров)» — возможно, вам следует использовать наследование, композицию или другие подходы для уменьшения количества отдельных фрагментов кода, которые имеют дело с WebView.

CommonsWare 25.11.2022 21:59
2
1
138
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не совсем знаком с Datadog Sdk, но вы можете попробовать создать свой собственный WebView, расширив стандартный, а затем заменив им все остальные WebView. Вот как это будет выглядеть на практике:

class TrackableWebView : WebView {

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
        : super(context, attrs, defStyleAttr)

    init {
        DatadogEventBridge.setup(this)
    }
}

Я думаю, мы можем предположить, что Sdk будет инициализирован намного раньше, чем WebViews, поэтому не должно быть проблем с вызовом DatadogEventBridge.setup(this) до инициализации Sdk.

Затем, если вы используете макеты XML, вы просто заменяете стандартный WebView своим собственным:

<com.example.TrackableWebView
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"/>

Большой! Я об этом не подумала, попробую!

emanoellucas 01.12.2022 16:06

Но у меня все еще есть вопрос: чтобы получить объекты веб-просмотра, я делаю что-то вроде этого: val myWebView = myActivityBinding.myWebView и это уже идет с типом WebView из Android-фреймворка. Как я могу изменить это, чтобы назначить тип CustomWebView (который наследуется от WebView) моему объекту веб-просмотра??

emanoellucas 04.12.2022 01:57

Я обновил свой ответ, вы просто замените WebView в макете XML.

Mieczkoni 04.12.2022 23:27

Вы можете использовать WebViewClient для перехвата создания WebView и последующего вызова DatadogEventBridge.setup(webView) оттуда. Вы можете создать класс, который расширяет WebViewClient, а затем добавить его в каждый из ваших WebView с помощью метода WebView.setWebViewClient(WebViewClient wvc).

public class DatadogWebViewClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, URL);
        DatadogEventBridge.setup(view);
    }
}

Другие вопросы по теме