Ponto de conhecimento técnico do Android: como usar a vinculação de dados para eliminar findViewById()

 Encontrar problemas

Toda vez que uma visualização é criada ou recriada usando a função findViewById() para obter uma referência a ela, o sistema Android percorre a hierarquia de visualizações para encontrá-la em tempo de execução. Isso não é um problema quando seu aplicativo tem apenas algumas visualizações. No entanto, um aplicativo de produção pode ter dezenas de visualizações em um layout e, mesmo com os melhores designs, haverá visualizações aninhadas.

Considere um layout linear contendo uma visualização de rolagem que contém uma visualização de texto. Para hierarquias de exibição maiores ou mais profundas, encontrar a exibição pode levar tempo suficiente, diminuindo significativamente a velocidade do aplicativo do usuário. O armazenamento em cache de visualizações em variáveis ​​ajuda, mas você ainda precisa inicializar uma variável para cada visualização em cada namespace. Com muitas exibições e várias atividades, elas se somam, o que leva ao aumento da duplicação de código e à redução da capacidade de manutenção do projeto, um problema técnico para todos os desenvolvedores.

Soluções técnicas

Crie um objeto contendo uma referência para cada visualização. Esse objeto, chamado de objeto Binding, pode ser usado por todo o seu aplicativo. Essa técnica é chamada de "vinculação de dados". Depois de criar um objeto de associação para seu aplicativo, você pode acessar exibições e outros dados por meio do objeto de associação sem precisar percorrer a hierarquia de exibição ou pesquisar dados.

A vinculação de dados tem os seguintes benefícios:

  • O código é mais curto, mais fácil de ler e manter do que o código usando findViewById().
  • Dados e visualizações são claramente separados.
  • O sistema Android só precisa percorrer a hierarquia de visualizações uma vez para obter cada visualização, o que acontece durante a inicialização do aplicativo, não em tempo de execução quando o usuário está interagindo com o aplicativo.
  • Você obtém segurança de tipo para acessar visualizações. (Segurança de tipo significa que o compilador valida o tipo em tempo de compilação e gera um erro se você tentar atribuir o tipo errado a uma variável.)

Nesta tarefa, você configurará a vinculação de dados e usará a vinculação de dados para substituir chamadas para findViewById() por chamadas para o objeto vinculado.

Passos

Etapa 1: ativar a vinculação de dados

Para usar a vinculação de dados, você precisa habilitar a vinculação de dados em seu arquivo Gradle, pois ela não está habilitada por padrão. Isso ocorre porque a vinculação de dados aumenta o tempo de compilação e pode afetar o tempo de inicialização do aplicativo.

1. Abra o arquivo build.gradle (Módulo: nome do projeto.app), conforme mostrado na figura a seguir:

2.添加一个「buildFeatures」大括号并设置dataBinding为true,代码如下:

android {
  ...
  
  buildFeatures {
    dataBinding true
  }
}

3.出现同步项目的提示时,点击「立刻同步(Sync Now)」,如果没有提示,请依次执行「文件(File)> 使用Gradle文件来同步项目(Sync Project with Gradle Files)」操作,或直接点击工具栏右侧的Gradle图标,如下图所示:

第 2 步:更改布局文件以用于数据绑定 

要使用数据绑定,您需要使用标签来包装XML 布局。这样根类就不再是视图组,而是包含视图组和视图的布局。然后绑定对象可以识别出布局和其中的视图。

1.打开activity_main.xml文件,并切换到「代码(Code)」选项卡,如下图所示:

2.将之前的ConstraintLayout标签替换为标签。

通常的语法结构,代码如下:

<layout>
   <LinearLayout ... >
   ...
   </LinearLayout>
</layout>

示例代码,​如下:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnText" />

    </LinearLayout>

</layout>

「小知识」

依次执行「代码(Code) > 重新格式化代码(Reformat Code)」操作,修复代码缩进即可,如下图所示:

第 3 步:在MainActivity类中创建绑定对象 

将绑定对象的引用添加到MainActivity类内,以便您可以使用它来访问视图。

1.打开MainActivity.kt或MainActivity.java文件,代码如下:

Kotlin

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

}

Java

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

2.在onCreate()方法上为绑定对象创建一个变量。该变量通常称为binding。binding类型,ActivityMainBinding类是由编译器专门为此主活动创建的。该名称来自布局文件的名称,即activity_main+Binding。

流程思路,如下图所示:

「小知识」

小驼峰式命名法(lower camel case):第一个单字以小写字母开始,第二个单字的首字母大写。例如:firstName、lastName。
大驼峰式命名法(upper camel case):每一个单字的首字母都采用大写字母,例如:FirstName、LastName、CamelCase。

示例代码,如下:

// Kotlin
private lateinit var binding: ActivityMainBinding

// Java
ActivityMainBinding binding;

3.点击ActivityMainBinding,并按下「Alt+Enter(Win版)或Option+Enter(Mac版)」组合键,导入这个缺失的类即可。

导入前,提示「导入ActivityMainBinding」,如下图所示:

 Kotlin

Java

导入后,添加相关的import语句,代码如下:

// Kotlin
import com.fm.test.databinding.ActivityMainBinding

// Java
import com.fm.test.databinding.ActivityMainBinding;

4.使用来自DataBindingUtil类的setContentView()函数来与带有MainActivity类的activity_main布局相关联。此setContentView()函数还负责视图的一些数据绑定设置。在onCreate()中,用以下代码行替换之前的setContentView()函数调用。

替换前

//Kotlin
setContentView(R.layout.activity_main)

//Java
setContentView(R.layout.activity_main);

替换后

//Kotlin
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

//Java
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

5.导入DataBindingUtil类,代码如下:

//Kotlin
import androidx.databinding.DataBindingUtil

//Java
import androidx.databinding.DataBindingUtil;

第 4 步:使用绑定对象替换对findViewById()的所有调用

现在可以将对绑定对象中视图的引用替换为对findViewById()的所有调用。创建绑定对象时,编译器从从布局中视图的ID生成绑定对象中视图的名称。例如,按钮的id属性值是user_btn,和绑定对象中的userBtn一样。

在onCreate()中,将findViewById()替换为引用绑定对象中的ID属性值「注意:以小驼峰式命名法(lower camel case)为准」。将findViewById(R.id.btn)替换为binding.btn,并添加要执行的操作代码,代码如下:

Kotlin

import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.fm.test.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.btn.setOnClickListener(this::clickHandlerFunction)
    }

     private fun clickHandlerFunction(view: View) {
       Toast.makeText(this,"我是未来码匠",Toast.LENGTH_LONG).show()
    }

}

Java

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.fm.test.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.btn.setOnClickListener(this::clickHandlerFunction);
    }

    public void clickHandlerFunction(View view) {
        Toast.makeText(this,"我是未来码匠", Toast.LENGTH_LONG).show();
    }
}

提示

Se você vir erros do compilador depois de fazer alterações, escolha Build > Clean Project e escolha Build > Rebuild Project. Isso geralmente atualizará os arquivos gerados. Caso contrário, escolha Arquivo > Invalidar Caches/Reiniciar para uma limpeza mais completa.

Você aprendeu anteriormente sobre o objeto Resources que contém referências a todos os recursos em seu aplicativo. Você pode vincular objetos de maneira semelhante ao fazer referência a uma exibição; no entanto, esse objeto Binding é muito mais complexo.

resultado em execução

Resumir

Etapas para substituir a chamada para findViewById() pela vinculação de dados:

  1. Habilite a vinculação de dados dentro da seção android do arquivo build.gradle (Módulo: projectname.app): buildFeatures { dataBinding true }
  2. Usado como a exibição raiz em layouts XML.
  3. Definir variáveis ​​de ligação: ligação privada lateinit var:ActivityMainBinding (Kotlin) ou ligação ActivityMainBinding
  4. Crie um objeto de ligação dentro da classe MainActivity e substitua setContentView(R.layout.activity_main) por binding = DataBindingUtil.setContentView(this, R.layout.activity_main).
  5. Substitua a chamada para findViewById() por uma referência ao valor da propriedade de ID da visualização no objeto de associação. Por exemplo: findViewById
(R.id.btn)=>binding.btn, ou seja, neste exemplo, o nome da visualização é o valor do atributo ID da visualização no arquivo XML "Observação: prevalecem as minúsculas camel case".

A prática dá o verdadeiro conhecimento, e a pesquisa dá sabedoria. Não importa quão difícil seja, não importa o que aconteça, mantenha um coração sábio e corajoso, estude cuidadosamente, analise o problema, pense com cuidado, encontre e aproveite o avanço, e então o problema poderá ser resolvido. Para superar as dificuldades, você deve ter paciência, caso contrário você não será capaz de se desafiar e romper os limites.

到这里为止,欢迎大神们随便吐槽我所写的技术文章,抓住我的痛点,请献上最宝贵的最佳的技术方案吧。放心吧,我不会复仇大家,因为大家永远都是我最好的导师。若大家对此有疑惑的地方,就能找我讨论一下,开阔眼界,增长见识。我希望得到大家的鼓励和点赞,将是我创作的最大动力。

作者声明

本篇经验系本人依照真实经历原创,需要转载到博客、自媒体平台、技术网站等,未经许可,严格遵守本人的知识版权,谢绝转载。如想转载,请联系本人授权。

联系邮箱:[email protected]

微信号:X9267543839

QQ:3403978592

Acho que você gosta

Origin juejin.im/post/7122379358064345101
Recomendado
Clasificación