2

How to initialize VievBinding? In AppCompactActivity version 1.0.0, it became possible to pass a layout to the parent constructor so that you would not write OnCreateView. I do so, but then I want to use VievBinding, but it doesn’t work for me. Text is not displayed. What can be done?

    class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onStart() {
        super.onStart()
        var binding = ActivityMainBinding.inflate(layoutInflater)
        binding.hello.text = "Hello"
    }
}

Yuri Petrov
  • 193
  • 1
  • 8

3 Answers3

6
class MainActivity : AppCompatActivity(R.layout.activity_main) {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.bind(findViewById(Window.ID_ANDROID_CONTENT).getChildAt(0))
    }

Although it's easier if you rely on __Binding.inflate().

class MainActivity : AppCompatActivity {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater, R.layout.activity_main)
        setContentView(binding.root)
    }

Layout inflation should not be in onStart. It goes in onCreate in Activity, and onCreateView in Fragment.

EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428
  • Yes it would be easier. But I need to make BaseActivity, and that all Activity would be inherited from it. – Yuri Petrov Mar 05 '20 at 15:32
  • I don't understand how that changes anything in what I said? – EpicPandaForce Mar 05 '20 at 15:36
  • class MainActivity : AppCompatActivity(R.layout.activity_main) { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.bind(findViewById(Window.ID_ANDROID_CONTENT)) } – Yuri Petrov Mar 05 '20 at 15:40
  • Not work Caused by: java.lang.ClassCastException: androidx.appcompat.widget.ContentFrameLayout cannot be cast to androidx.constraintlayout.widget.ConstraintLayout – Yuri Petrov Mar 05 '20 at 15:43
  • Oh, very interesting. I'll change my answer accordingly. – EpicPandaForce Mar 05 '20 at 15:44
1
// Activity class
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState);

   val binding:YourActivityLayoutBinding = 
         DataBindingUtil.setContentView(this, R.layout.your_activity_layout);
}

Layout views in xml should be surrounded by <layout> tag

<layout>
...// your activity view layout
</layout>
Narek Hayrapetyan
  • 1,731
  • 15
  • 27
0

var binding = ActivityMainBinding.inflate(layoutInflater)

This will inflate the layout again and you will get a different instance of the views than what is already set in the activity

Try using the below code to bind the activity view to the binder. Where ROOT_VIEW_ID is view id of root view in your layout

var binding = ActivityMainBinding.bind(findViewById(ROOT_VIEW_ID))*
*binding.hello.text = "Hello"

Gani
  • 3
  • 2