【问题标题】:Access view binding in Fragment from Activity从 Activity 访问 Fragment 中的视图绑定
【发布时间】:2021-03-16 01:04:32
【问题描述】:

我正在升级应用程序以删除所有合成并使用新的 ViewBinding 功能。到目前为止,只要您在您正在访问的类/布局内,一切正常,但我在 Main Activity 中有对布局元素的综合引用。

类片段中:

    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)
    }

我有用于对话框的方法,这些方法使用合成来使 Fragment 中的布局元素变暗。 例如。

//textView on fragment layout.xml
textView?.alpha = someFloat

这在合成时可以正常工作,但是我无法根据 Android 的文档使新的视图绑定工作。如何使用 ViewBinding 轻松模仿合成行为?到目前为止,它已经大量增加了代码,并且除非已创建 Fragment 的视图并且确实使代码变得更糟且更难理解,否则它不起作用。我尝试使用绑定主活动布局根视图,但出现“视图必须有标签”错误,并且所有布局都以 <layout> 开头。任何帮助表示赞赏。

【问题讨论】:

    标签: android android-fragments android-activity android-viewbinding synthetic


    【解决方案1】:

    由于您的问题很抽象,我想出了以下内容

    textView?.alpha = someFloat
    

    会变成

    如果您的文本视图在片段中

    binding.textView.alpha = someFloat
    

    如果它在活动中

    mainBinding.textView.alpha = someFloat
    

    【讨论】:

      【解决方案2】:

      如果您想从活动中访问片段中的视图绑定,那么简单的答案就是您不能。因为您无法从活动中访问片段中的任何属性。

      反之亦然,您可以从片段访问活动属性。将您的财产之一设为公开,并使用requireActivity().propertiesInActivity 访问,例如:

      活动中:

      private var binding: ActivityYourBinding? = null
      val bind get() = binding!!
      

      在 Fragment 中(这个 Fragment 父级是 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
              ...
      }
      

      希望这可以帮助任何人并解决他们的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多