Можно ли получить доступ к закрытой функции из объекта-компаньона (статической функции) из того же класса - PullRequest
0 голосов
/ 24 июня 2019

Я работаю над конкретной задачей над одним проектом в Android Studio и столкнулся со следующей проблемой.Я пытаюсь установить свойство onClick одного пункта меню, и чтобы оно работало так, как мне хотелось бы, мне нужен доступ к закрытой функции в другом классе.Я знаю, что это большое программирование "нет-нет", которое устраняет весь смысл функции как частной.

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

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

В настоящее время я пытаюсь получить доступ к закрытой функции через объект-компаньон в том же классе, но ничего из того, что я пробовал, не работает.Есть ли способ для меня, чтобы достичь этого?Достигнуть этого невозможно и или так же бессмысленно, как получить доступ к закрытому методу из другого класса?

Чтобы упростить то, что я пытаюсь сделать: у меня есть строка меню с несколькими элементами: элементом поиска и элементом конфигурации (дляизменение стилей, размеров и т. д.) и т. д. Меня попросили добавить еще один элемент, который при нажатии автоматически выбирает часть текста из текущего веб-представления.Судя по моим неудачным попыткам, я начинаю понимать, что такая кнопка не принадлежит меню и должна быть реализована где-то еще.

Функция, которая устанавливает события onclick для элементов: (Мне нужно инициализировать itemBookmark)

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    //Log.d(LOG_TAG, "-> onOptionsItemSelected -> " + item.getItemId());

    val itemId = item.itemId

    if (itemId == android.R.id.home) {
        Log.v(LOG_TAG, "-> onOptionsItemSelected -> drawer")
        startContentHighlightActivity()
        return true

    } else if (itemId == R.id.itemSearch) {
        Log.v(LOG_TAG, "-> onOptionsItemSelected -> " + item.title)
        if (searchUri == null)
            return true
        val intent = Intent(this, SearchActivity::class.java)
        intent.putExtra(SearchActivity.BUNDLE_SPINE_SIZE, spine?.size ?: 0)
        intent.putExtra(SearchActivity.BUNDLE_SEARCH_URI, searchUri)
        intent.putExtra(SearchAdapter.DATA_BUNDLE, searchAdapterDataBundle)
        intent.putExtra(SearchActivity.BUNDLE_SAVE_SEARCH_QUERY, searchQuery)
        startActivityForResult(intent, RequestCode.SEARCH.value)
        return true

    } else if (itemId == R.id.itemConfig) {
        Log.v(LOG_TAG, "-> onOptionsItemSelected -> " + item.title)
        showConfigBottomSheetDialogFragment()
        return true

    } else if (itemId == R.id.itemTts) {
        Log.v(LOG_TAG, "-> onOptionsItemSelected -> " + item.title)
        showMediaController()
        return true
    } else if (itemId == R.id.itemBookmark) {
        // Should be initialized here

        return true
    }

    return super.onOptionsItemSelected(item)
}

Частная функция из другого класса, к которой я пытаюсь получить доступ:

 private fun computeTextSelectionRect(currentSelectionRect: Rect) {
    Log.v(LOG_TAG, "-> computeTextSelectionRect")

    val viewportRect = folioActivityCallback.getViewportRect(DisplayUnit.PX)
    Log.d(LOG_TAG, "-> viewportRect -> $viewportRect")

    if (!Rect.intersects(viewportRect, currentSelectionRect)) {
        Log.i(LOG_TAG, "-> currentSelectionRect doesn't intersects viewportRect")
        uiHandler.post {
            popupWindow.dismiss()
            uiHandler.removeCallbacks(isScrollingRunnable)
        }
        return
    }
    Log.i(LOG_TAG, "-> currentSelectionRect intersects viewportRect")

    if (selectionRect == currentSelectionRect) {
        Log.i(
            LOG_TAG, "-> setSelectionRect -> currentSelectionRect is equal to previous " +
                    "selectionRect so no need to computeTextSelectionRect and show popupWindow again"
        )
        return
    }

    Log.i(
        LOG_TAG, "-> setSelectionRect -> currentSelectionRect is not equal to previous " +
                "selectionRect so computeTextSelectionRect and show popupWindow"
    )
    selectionRect = currentSelectionRect

    val aboveSelectionRect = Rect(viewportRect)
    aboveSelectionRect.bottom = selectionRect.top - (8 * density).toInt()
    val belowSelectionRect = Rect(viewportRect)
    belowSelectionRect.top = selectionRect.bottom + handleHeight

    //Log.d(LOG_TAG, "-> aboveSelectionRect -> " + aboveSelectionRect);
    //Log.d(LOG_TAG, "-> belowSelectionRect -> " + belowSelectionRect);

    // Priority to show popupWindow will be as following -
    // 1. Show popupWindow below selectionRect, if space available
    // 2. Show popupWindow above selectionRect, if space available
    // 3. Show popupWindow in the middle of selectionRect

    //popupRect initialisation for belowSelectionRect
    popupRect.left = viewportRect.left
    popupRect.top = belowSelectionRect.top
    popupRect.right = popupRect.left + viewTextSelection.measuredWidth
    popupRect.bottom = popupRect.top + viewTextSelection.measuredHeight
    //Log.d(LOG_TAG, "-> Pre decision popupRect -> " + popupRect);

    val popupY: Int
    if (belowSelectionRect.contains(popupRect)) {
        Log.i(LOG_TAG, "-> show below")
        popupY = belowSelectionRect.top

    } else {

        // popupRect initialisation for aboveSelectionRect
        popupRect.top = aboveSelectionRect.top
        popupRect.bottom = popupRect.top + viewTextSelection.measuredHeight

        if (aboveSelectionRect.contains(popupRect)) {
            Log.i(LOG_TAG, "-> show above")
            popupY = aboveSelectionRect.bottom - popupRect.height()

        } else {

            Log.i(LOG_TAG, "-> show in middle")
            val popupYDiff = (viewTextSelection.measuredHeight - selectionRect.height()) / 2
            popupY = selectionRect.top - popupYDiff
        }
    }

    val popupXDiff = (viewTextSelection.measuredWidth - selectionRect.width()) / 2
    val popupX = selectionRect.left - popupXDiff

    popupRect.offsetTo(popupX, popupY)
    //Log.d(LOG_TAG, "-> Post decision popupRect -> " + popupRect);

    // Check if popupRect left side is going outside of the viewportRect
    if (popupRect.left < viewportRect.left) {
        popupRect.right += 0 - popupRect.left
        popupRect.left = 0
    }

    // Check if popupRect right side is going outside of the viewportRect
    if (popupRect.right > viewportRect.right) {
        val dx = popupRect.right - viewportRect.right
        popupRect.left -= dx
        popupRect.right -= dx
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...