Resumo da pesquisa sobre ligação de dados Android

Em 2018, conduzi um período de pesquisa no Android DataBinding (digamos que foi uma pesquisa e provavelmente durou menos de duas semanas), pisei em alguns poços e coloquei o resumo no Evernote naquela época. Hoje, por acaso , Voltei-me para as coisas que resumi antes e sinto que devo compartilhá-las. Espero poder ser útil para amigos que enfrentam problemas semelhantes.

O todo é dividido em três partes:

Cenários de aplicativos, desvantagens, vantagens

1. Cenários de aplicação

1. Os campos da tela são muitos e complexos e são basicamente orientados para a exibição, com menos interação.

 

2. Desvantagens

1. A mensagem de alerta é dolorosa quando a compilação falha e um erro é relatado

tal como:

Na verdade, esse erro é causado por um problema com a gravação do método de chamada na tela e ele não foi compilado.

código mostrado abaixo:

<TextView

    android:id="@+id/tv_order_state"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentRight="true"

    android:textSize="@dimen/common_font_size_level_3"

    android:textColor="@{orderDetailActivity.showOrderStateTextColor()}”/>

No entanto, o relatório de erros é basicamente uma informação que não tem nada a ver com este problema.A parte mais valiosa é que pode ser localizado diretamente nas informações de erro.

android:textColor="@{orderDetailActivity.showOrderStateTextColor()}”/>

Nesta linha, o resto das informações são basicamente inúteis.

 

2. A página de prompt de erro estático do editor xml é muito dolorosa. Códigos que funcionam sem problemas também darão um til vermelho (este é o compilador usado em 18 anos e é muito mais inteligente do que antes. Você não pode mais ver o til vermelho na captura de tela na última versão 3.3 do AS).

tal como:

 

A linha vermelha aparece e a mensagem de prompt é:

Mas o código real pode ser executado e é executado sem problemas.

 

3. Quando o método de gravação não é padrão, a mensagem de erro solicitada não pode fornecer referência

Por exemplo, de acordo com o código escrito na documentação oficial do databinding:

Finalmente, haverá um aviso depois que a compilação for bem-sucedida:

A solução online é remover o prefixo de atributo "binding:" em @BindingAdapter.

Pessoalmente, sinto muito cottage. No entanto, nenhuma outra solução foi encontrada ainda.

 

4. Na expressão e gramática de @DataBinding, recursos de mipmap temporariamente não são suportados.

Em outras palavras, você pode escrever isso no arquivo de layout:

bind:error="@{@drawable/list_default}"

Mas você não pode escrever assim:

bind:error="@{@mipmap/list_default}"

Um erro será relatado ao escrever o mipmap. do seguinte modo:

Muito sem palavras.

 

5. As dicas de código em xml não são tão poderosas quanto as de arquivos java.

 

6. Se a classe de ferramenta importada em xml precisar usar outros objetos do tipo não-pojo, como injetá-la?

Resposta: Injetar de acordo com o método normal, não há diferença do pojo, mas às vezes é limitado por alguns bugs do IDE, que irão causar muitos problemas, tais como: o método que foi gerado claramente, o IDE avisa um erro quando é chamado. Neste momento, você precisa reiniciar o IDE para voltar ao normal.

 

7. No arquivo de modelo de tela, o método correspondente à tela não pode ser usado diretamente e a injeção é necessária, que é um pouco diferente do AngularJS.

 

8. Para aqueles que não estão familiarizados com a estrutura, muitos problemas são difíceis de localizar.

Por exemplo, na tela de detalhes do produto, o controle do banner é usado, mas a imagem não é exibida em vida e morte.Se for escrita normalmente, deve ser exibida. Mas depois de usar a estrutura de vinculação de dados, ele não pode ser exibido, esse tipo de problema.

Posteriormente, constatou-se que não era o problema do controle do banner, mas sim o problema de esquecer de chamar o método de início do controle do banner. No entanto, devido ao uso de uma estrutura de vinculação de dados, haverá alguma interferência na solução de problemas.

 

9. O prompt de erro de compilação não é amigável:

Por exemplo, encontrei um problema:

提示 : Erro: (42, 34) Não é possível encontrar o setter para o atributo 'bind: imageUrl' com o tipo de parâmetro java.lang.String em com.makeramen.roundedimageview.RoundedImageView.

No entanto, bind: imageUrl e bind: error são claramente declarados em BindingAdapter, mas um erro é relatado quando bind: imageUrl é especificado.

A dica é: o setter de bind: imageUrl não pode ser encontrado, mas esta propriedade foi declarada com BindingAdapter.

Na verdade, o verdadeiro motivo é:

参见 url :http://blog.csdn.net/gdut_lemon/article/details/53330631

O prompt errado é realmente hostil. Pode ser considerado basicamente inútil para os ovos.

 

10. A injeção do objeto precisa ser feita manualmente, e às vezes a etapa de injeção manual é esquecida.

Por exemplo: quando o evento onClick é injetado, embora seja escrito assim:

android:onClick="@{fragment::onAllCommentsClick}"

No entanto, se você esquecer de chamar o método correspondente de injeção do objeto de fragmento no código Java, esse ouvinte não funcionará.

binding.setFragment(this);

E a injeção deste objeto ouvinte é fácil de esquecer,

Porque no desenvolvimento tradicional, poderíamos escrever diretamente no controle assim:

android:onClick=“onBtnClick"

Neste momento, basta escrever um método na atividade correspondente:

public void onBtnClick(View v){

    // Do something

}

É isso. Isso economiza uma etapa em comparação com DataBinding.

 

11. A estrutura de ligação de dados não suporta o uso dos recursos fornecidos pela estrutura na marca do fragmento. Em outras palavras, não podemos vincular variáveis ​​à tag do fragmento.

Se fizermos isso, um erro será relatado ao compilar primeiro. A mensagem de erro é: a vinculação de dados não pode ser usada no fragmento (o significado do prompt em inglês incorreto traduzido)

O segundo problema é,

Ao tentar definir um @BindingAdapter para lidar com Fragment, o seguinte erro será relatado:

Erro: (36, 24) 错误: @BindingAdapter bindFragmentParams (android.support.v4.app.Fragment, java.lang.String, java.lang.String) é aplicado a um método que não aceita uma subclasse View como o primeiro ou segundo parâmetro. Quando um BindingAdapter usa um DataBindingComponent, o parâmetro do componente é o primeiro e o parâmetro View é o segundo, caso contrário, o parâmetro View é o primeiro.

A tradução das palavras acima é: se você usar BindingAdapter para definir novas propriedades, o primeiro parâmetro é um DataBindingComponent ou uma Visualização, caso contrário, não funcionará. O código de erro é o seguinte:

@BindingAdapter({"bind:fragmentParamKey", "bind:fragmentParam"})

public static void bindFragmentParams(Fragment fragment, String paramKey,String param) {

    Bundle bundle = new Bundle();

    bundle.putString(paramKey,param);

    fragment.setArguments(bundle);

}

 

12. Ao usar a inclusão para aninhamento no layout, o objeto de ligação não pode obter os controles no layout de inclusão por id.

 

13. Ao reconstruir recursos como cadeias de caracteres com parâmetros, os nomes de variáveis ​​correspondentes no arquivo de layout de ligação de dados não podem ser reconstruídos diretamente por meio da reconstrução. tal como:

<TextView

    android:id="@+id/tv_order_total_fee"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_centerVertical="true"

    android:layout_toRightOf="@+id/tv_sum_title"

    android:textColor="@color/common_warn_font_color"

    android:textSize="@dimen/common_font_size_level_2"

    android:text="@{@string/common_item_price(orderDetailModel.totalAmount)}"/>

Aqui, se a variável string é reconstruída em strings.xml e common_item_price é reconstruída em common_item_price_with_symbol, a parte vermelha do código aqui não pode ser reconstruída diretamente por meio da reconstrução de AS. Você deve modificá-lo manualmente.

 

14. CustomListView (usado para o controle de lista aninhado em ScrollView) tem pontos ao usar o modo de desenvolvimento de ligação de dados para desenvolver o adaptador. Principalmente refletido em: Quando o texto do controle TextView no item da lista é mais de uma linha, há um problema com o cálculo da altura da lista, que faz com que a lista seja exibida de forma incompleta (a altura de exibição real da lista é menor do que a altura real da lista, fazendo com que parte do conteúdo fique truncado).

Ao usar o modo de suporte tradicional para gravar no adaptador, esse problema não existe.

 

3. Vantagens:

1. O código se torna simplificado

Depois de reescrever a tela de detalhes do pedido com a estrutura DataBinding, o código Java 354-> arquivo de layout 264: 537-> 510 (A redução do código é devido à otimização do layout, portanto, esta parte não é realmente reduzida em circunstâncias normais, mas em vez disso, haverá um aumento. Antes que o layout seja otimizado, é cerca de 537-> 550+, ou seja, cerca de 20 linhas a mais)

Portanto, a quantidade de código após o uso da ligação de dados é reduzida em cerca de 70 linhas, e a quantidade geral de código é 891-> 814, o que reduz a quantidade de código em 10%.

 

2. A lógica da página torna-se simples e clara.

É como se o sentimento de JQuery mudasse para Angular. Com a vinculação de dados, não há necessidade de escrever uma grande seção de código para o processamento de vinculação de dados do controle.

 

3. Elimine findViewById (na verdade, ele faz o que ButterKnife esse tipo de estrutura de anotação faz por nós, mas a vinculação de dados é mais conveniente no uso real, porque nos permite nem mesmo escrever anotações)

Em um arquivo de layout que usa ligação de dados, desde que especifiquemos um id para um controle, um controle correspondente ao id correspondente será gerado no objeto de ligação correspondente. Podemos nos referir diretamente a esse objeto por meio do objeto de ligação.

Acho que você gosta

Origin blog.csdn.net/awy1988/article/details/88543242
Recomendado
Clasificación