Я работаю над конкретной задачей над одним проектом в 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
}
}