Доступ к привязке представления во фрагменте из Activity

#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
        ...
}
 

Надеюсь, это может помочь кому-либо и решить их проблему