#android #android-fragments #android-activity #android-viewbinding #synthetic
#Android #android-фрагменты #android-activity #android-привязка представления #синтетический
Вопрос:
Я обновляю приложение, чтобы удалить всю синтетику и использовать новую функцию привязки к просмотру. Пока все работает, пока вы находитесь внутри класса / макета, к которому вы обращаетесь, но у меня есть синтетические ссылки на элементы макета в моей основной деятельности.
Фрагмент в классе:
private var _binding: FragmentBinding? = null
val binding get() = _binding!!
private val compositeDisposable = CompositeDisposable()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
App.instance.getAppComponent().inject(this)
_binding = FragmentBinding.inflate(inflater, container, false)
return binding.root
}
В MainActivity у меня есть:
private lateinit var mainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(null)
mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mainBinding.root)
}
У меня есть методы для диалоговых окон, которые используют синтетику для затемнения элементов макета во фрагменте.
например.
//textView on fragment layout.xml
textView?.alpha = someFloat
Это прекрасно работает при синтезе, однако я не могу заставить новую привязку представления работать на основе документации Android. Как я могу легко имитировать синтетическое поведение с помощью привязки к просмотру? До сих пор это значительно увеличивало объем кода и не работало до тех пор, пока не было создано представление фрагмента, и честно сделало код хуже и труднее для понимания. Я попытался использовать привязку к корневому представлению основного макета действия, но я получил ошибки «представление должно иметь тег», и все макеты начинаются с <layout>
. Любая помощь приветствуется.
Ответ №1:
Поскольку ваш вопрос абстрактный, я пришел к следующему
textView?.alpha = someFloat
станет
если ваше текстовое представление находится во фрагменте
binding.textView.alpha = someFloat
и в случае, если он находится в activity
mainBinding.textView.alpha = someFloat
Ответ №2:
Если вы хотите получить доступ к привязке представления во фрагменте из activity, простой ответ на это — вы не можете. Потому что вы не можете получить доступ к каким-либо свойствам во фрагменте из activity.
И наоборот, вы можете получить доступ к свойству activity из фрагмента. Сделайте одно из ваших свойств общедоступным и получите доступ с requireActivity().propertiesInActivity
помощью, например:
В Activity:
private var binding: ActivityYourBinding? = null
val bind get() = binding!!
Во фрагменте (родительским элементом которого является Activity):
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
...
var someFloat = 0 // fill with your number
val yourActivity = requireActivity() as YourActivity
yourActivity.bind.yourTextView.alpha = someFloat
...
}
Надеюсь, это может помочь кому-либо и решить их проблему