Как использовать привязку вида в Android

Я использую findViewById а затем ButterKnife, чтобы связать взгляды. Недавно я наткнулся на эту статью: https://proandroiddev.com/new-in-android-viewbindings-the-difference-from-databinding-library-bef5945baf5e и не совсем уверен, как ее использовать.

Я пытался сделать это, но это не похоже на работу в Android Studio 3.4.2

val binding = MainActivityBinding.inflate(layoutInflater)setContentView(binding.root)

затем, используя эти значения, например:

binding.button....

binding.textView....

13 ответов

Решение

ViewBindings представлены в этот момент этого выступления в Google IO/19. Он будет доступен в Android Studio 3.6, и, как вы упомянули, вы используете Android Studio 3.4.2, поэтому он не работает. Прочитайте часть ViewBindings в этой статье для большего количества ссылок. Надеюсь это поможет!

Вот несколько вещей, которые вы должны сделать, и я стараюсь упорядочить их и перечислить: (На основе документов разработчиков Android из этой ссылки и моего личного опыта)

  1. Вам необходимо использовать Android Studio 3.6 canary11+ (в настоящее время я использую Android Studio 4, и он хорошо справляется со своей работой)

    Вы можете найти его здесь:https://developer.android.com/studio/archive

  2. Вам необходимо обновить оболочку Gradle до Gradle "5.6.4" и инструмент сборки Gradle до "3.6.0-rc01", более поздние версии также работают, поэтому не бойтесь обновляться

    distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
    dependencies {

        ...
        classpath 'com.android.tools.build:gradle:3.6.0-rc01'

    }
  1. Чтобы включить привязку представления в модуле, добавьте элемент viewBinding в его файл build.gradle, как показано в следующем примере:
    android {
    ...
    buildFeatures {
        viewBinding true
    }
}
  1. Если вы хотите, чтобы файл макета игнорировался при создании классов привязки, добавьте tools:viewBindingIgnore="true" атрибут корневого представления этого файла макета:
    <LinearLayout
        ...
        tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>
  1. Если привязка представления включена для модуля, класс привязки создается для каждого файла макета XML, который содержит модуль. Каждый класс привязки содержит ссылки на корневое представление и все представления, имеющие идентификатор. Имя класса привязки создается путем преобразования имени файла XML в регистр верблюда и добавления слова "привязка" в конец.

    Например, учитывая файл макета с именем result_profile.xml:

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

Сгенерированный класс привязки называется ResultProfileBinding. Этот класс имеет два поля:TextView называется name и Button называется button. ВImageView в макете нет идентификатора, поэтому нет ссылки на него в классе привязки.

Каждый класс привязки также включает getRoot(), предоставляя прямую ссылку на корневое представление соответствующего файла макета. В этом примереgetRoot() метод в ResultProfileBinding класс возвращает LinearLayout корневой вид.

  1. Чтобы настроить экземпляр класса привязки для использования с адаптером вида активности, фрагмента или карты, выполните следующие действия:
  • в методе действия onCreate():
    private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}
  • в методе onCreateView() фрагментов:
    private FragmentHousesBinding binding;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        binding = FragmentHousesBinding.inflate(inflater, container, false);

        init();

        return binding.getRoot();
    }
  • в методе onCreateViewHolder() адаптера представления карты:
    HouseCardPropertyFragmnetBinding binding;

    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        binding = HouseCardPropertyFragmnetBinding.inflate(LayoutInflater
            .from(parent.getContext()), parent, false);

        return new Holder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull HouseAdapter.Holder holder, int position) {
        holder.bindData(getItem(position));
    }

    class Holder extends RecyclerView.ViewHolder {

        HouseCardPropertyFragmnetBinding view;

        Holder(@NonNull HouseCardPropertyFragmnetBinding v) {
            super(v.getRoot());
            view = v;
        }

        void bindData(Tag item) {
            view.tagTxt.setText(item.Name);

        }
    }

вот и все вы свободны от findViewById впредь;)

В большинстве случаев привязка представления заменяет findViewById.

Java Добавьте это в файл Gradle

      android {
...
buildFeatures {
    viewBinding true
}

}

Котлин

      android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

Если вы хотите, чтобы файл макета игнорировался при создании классов привязки, добавьте атрибут tools:viewBindingIgnore="true" в корневое представление этого файла макета:

      <LinearLayout
    ...
    tools:viewBindingIgnore="true" >
...

Использовать привязку представления в действиях

Котлин

      private lateinit var binding: ResultProfileBinding

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

Ява

      private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

Теперь вы можете использовать экземпляр класса привязки для ссылки на любое из представлений:

Котлин


Ява


просмотреть привязку во фрагментах

Котлин

      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
}

Ява

      private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

Теперь вы можете использовать экземпляр класса привязки для ссылки на любое из представлений:

Котлин

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

Ява

      binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

Привязка просмотра доступна только в Android Studio 3.6 Canary 11+. Во-первых, вы обновляете Android-студию с помощью плагина android gradle версии 3.6.0-alpha11+ (вы можете использовать обе бета-версии, стабильная версия еще не выпущена, но вы можете использовать бета-версию), затем добавьте ниже код вbuild.gradle

android {
        viewBinding.enabled = true
}

Теперь вы можете использовать, как мы использовали, с привязкой данных вот так:

private lateinit var binding: ActivityMainBinding

@Override
fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    binding.textView.text = "Hello World"
}

это оно.

ViewBinding доступен только в Android Studio 3.6 и выше.

1:- Вам необходимо обновить свою сборку gradle до версии 3.6.1 в build.gradle (уровень проекта)

 dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
             }

2:- Вам необходимо включить viewBinding в build.gradle (приложение)

 android {
viewBinding {
    enabled = true
}}

После включения привязки представления для каждого макета XML создается класс привязки. Имя класса привязки создается путем преобразования имени файла XML в регистр верблюда и добавления слова "привязка" в конец.

Пример:- если файл макета назван как "add_item_activity.xml", тогда Имя класса привязки будет "AddItemActivityBinding"

3:-Чтоба создать экземпляр связующего класса для использования с активностью, создать экземпляр класса Binding, здесь мы создадим экземпляр "AddItemActivityBinding" и будет вызывать статический раздувать метод сгенерированного в связывающем классе

Получите ссылку на корневое представление, вызвав метод getRoot(), и передайте это корневое представление в методе setContentView()

public class AddItemActivity extends AppCompatActivity {
    private AddItemActivityBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = AddItemActivityBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        //now we can access views by their IDs 
        binding.tvTitleMyOrder.setText("Title goes here");

    }

}

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

:--------------------------------------------------- Это для Котлина ------- -------------------------------:

Вам необходимо выполнить два шага:

1) Добавьте viewBinding в модуль вашего проекта:

      buildFeatures{
        viewBinding true
    }

2) Добавьте привязку к вашему классу активности:

      private lateinit var binding: ActivitySplashBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(binding.root)

View BindingViewBinding доступен в Android Studio 3.6 и более поздних версиях.

  1. Он используется для привязки представлений к коду, другими словами, мы можем просто сказать, что он заменяет findViewById в Android, что сокращает шаблонный код.

  2. мы можем использовать привязку представления всякий раз, когда вы расширяете макеты, такие как Fragment, Activity или RecyclerView Adapter.

  3. После включения привязки представления он автоматически сгенерирует класс привязки для всех XML-макетов в проекте Android, и нет необходимости вносить какие-либо изменения в наши XML-макеты вручную.

  4. Мы можем включить привязку представления в build.gradle на уровне модуля.

    android {
    ...
    buildFeatures {
    viewBinding true
    }
    }

activity_simple_view_binding_example.xml

      <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SimpleViewBindingExample">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:id="@+id/demoTv"/>


</LinearLayout>

SimpleViewBindingExample.java

      public class SimpleViewBindingExample extends AppCompatActivity {

    private ActivitySimpleViewBindingExampleBinding activitySimpleViewBindingExampleBinding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activitySimpleViewBindingExampleBinding = ActivitySimpleViewBindingExampleBinding.inflate(getLayoutInflater());
        setContentView(activitySimpleViewBindingExampleBinding.getRoot());

        activitySimpleViewBindingExampleBinding.demoTv.setText("View Binding is simple");

    }
}

в котлине

Важное примечание: привязка просмотра доступна только для Android Studio 3.6+. реализовать привязку представления в проекте, вы можете выполнить следующие шаги.

Шаг 1: обновите версию Gradle (3.6.1+) в файле build.gradle (уровень проекта).

         dependencies {
            classpath 'com.android.tools.build:gradle:7.0.3' 
    }

Шаг 2. Добавьте эту строку в файл build.gradle (уровень приложения) в Android{} .

       buildFeatures {
        viewBinding = true
    }

Шаг 3: Добавьте этот код (в зависимости от названия вашей деятельности).

      class MainActivity : AppCompatActivity() {

 private lateinit var binding: ActivityMainBinding

 
 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root //you can use directly setContentView(binding.root)
    setContentView(view) 
    binding.textview.text="Hii" 

}

или вы можете реализовать вышеуказанную функциональность в этом коде. Я лично предпочитаю идти ко второму.

      class MainActivity : AppCompatActivity() {

    private val binding by lazy {

        ActivityMainBinding.inflate(layoutInflater)
    }


   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        binding.textview.text="Hii" 

    }
}

Как новичок, если вы хотите научиться реализовывать привязку данных в своем проекте Android.

затем просто выполните следующие действия:-

1:- Сначала откройте папку сценариев Gradel, найдите файл модуля build.gradel и вставьте этот код в проект Android .

       dataBinding {
        enabled = true
    }

Теперь вы можете получить доступ к свойствам этого представления.

попробуйте binding.myId.text = "Да, готово!";

Примечание:- myId - это имя моего идентификатора, который мы определили в представлении

В вашем файле класса:

var binding = MainActivityBinding.inflate(layoutInflater) setContentView(MainActivity.this, R.layout.activity_Main)

binding.name = "Hello world"

В вашем файле макета: родительский макет будет <layout> с участием <data>

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
    >
<!-- Inside the layout tag it is possible to set the data tag in order to set one or many variables. For this example we are having an User property-->
    <data>

        <variable
            name="name"
            type="String"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

<!-- your layout-->
     <TextView
        android:id="@+id/user_name_text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:text="@{name}" // here you can bind any data
        tools:text="Name"
        />

    </LinearLayout>

В Gradle:

apply plugin: 'kotlin-android'                       
apply plugin: 'kotlin-kapt'
android {
    ....
    dataBinding {
        enabled = true
    }
}
dependencies {
    ...
    // notice that the compiler version must be the same than our gradle version
    kapt 'com.android.databinding:compiler:2.3.1'
}

Рекомендую использовать вот так:

      private val viewBinding: ADarkModeBinding by lazy { ADarkModeBinding.inflate(layoutInflater) }

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   setContentView(viewBinding.root)
}

Из Android Studio 3.6 canary11+ u может использовать ViewBinding. Для справки см. Эту ссылку

Если вы используете Kotlin, все, что вам нужно сделать, это добавить этот плагин:

      plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-android-extensions' <--
}
Другие вопросы по тегам