Как заменить findViewById(v.getId()) на привязку к представлению?

#android #android-studio #view #binding

#Android #android-studio #Вид #привязка

Вопрос:

Нажав на кнопку, я могу найти идентификатор кнопки через findViewById(v.getId()) . Как я могу заменить его привязкой к представлению?

Это мой код:

 fun TastoClick(v: View) {
    val btn = findViewById(v.getId()) as Button
    var name = btn.text.toString().toInt()
}
 

Ответ №1:

Пожалуйста, ознакомьтесь с документацией для привязки к представлению, я уверен, вы найдете в ней ответы на свой вопрос.

Но в итоге:

  1. в build.gradle на уровне модуля добавьте:
     android {
        ...
        buildFeatures {
            viewBinding true
        }
    }
     
  2. Для фрагмента с подобным xml result_profile.xml класс привязки будет сгенерирован в формате: ResultProfileBinding затем вам нужно будет настроить экземпляр для этого класса, как показано ниже:

result_profile.xml:

 <LinearLayout ... >
    <TextView android:id="@ id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@ id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>
 

ResultProfileFragment.kt:

 private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
 
  1. Для действия:

ResultProfileActivity.kt:

 private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}
 

Затем вы можете получить доступ к элементам макета следующим образом:

 binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
 

Обновить:

Если у вас есть один прослушиватель для нескольких кнопок, вы можете просто сравнить представление, переданное в onClick метод, с вашим идентификатором привязки представления, т.е.

 v.id == binding.yourbutton.id
 

Оператор switch или оператор if может использоваться для проверки, какой идентификатор соответствует просмотру, на который был нажат.

Комментарии:

1. Спасибо, но это не позволяет мне получить идентификатор нажатой кнопки

2. Я уже использую привязку к представлению и хотел бы заменить все findViewById() в моем коде

3. просто вызовите binding.view.id и вы получите свое удостоверение личности.

4. Как сказал @benyuss, если вам нужно id , вы можете использовать код, который он показал, и вы можете удалить findViewById и вместо этого использовать binding.YOUR_ELEMENT_ID , как я показал в своем ответе. Вам не нужно получать представление по идентификатору, так как вы можете просто ссылаться на него, используя идентификатор, который вы ему дали, Надеюсь, это имеет смысл, и, пожалуйста, отметьте это как решенное, если оно решило вашу проблему, поставив галочку рядом с этим ответом

5. В моем XML-файле у меня есть «Tasto1», «Tasto2», «Tasto3» и так далее, с тем же «onClick». Я не знаю, какой из них нажат. С помощью findViewById(v.getId()) Я понял. Я могу использовать binding.view.id когда я узнаю идентификатор кнопки…

Ответ №2:

Kotlin

 val btn = binding.root.findViewById<Button>(v.id)