Anotação Android a funcionar de @IdRes
Eu estava a usar setId
método de View
Classe. De acordo com este método
public void setId(@IdRes int id) // This will accept resource id
quando tentei usar este método com algum valor hardcoded {[[8]} (digamos 100), então este método começa a lançar um aviso correcto que é esperado -
actionButton.setId(100);
recurso esperado do tipo id.
mas quando converti este valor hardcoded num método e nunca defini que este método regressaria {[[9]}, o aviso fica em silêncio.
private int getViewId() {
return 100;
}
método chamado a definir ID.
actionButton.setId(getViewId());
Os dois não são iguais. Hardcoded int
e a int
return from this method. Então, por que em um método de lançamento de alerta e em outro fica em silêncio.
Por amor de Deus, tentei com o StringRes
mas estou a ser avisado em ambos os casos.
private void setMyString(@StringRes int resourceString) {}
aviso em ambos os casos abaixo -
setMyString(1);
setMyString(getStringId()); getStringId returns int value
2 answers
É apenas um aviso uma vez que o método espera que uma variável seja de R.id classe.
Em relação ao caso do valor retornado de um método, o Lint não se dá ao trabalho de verificar toda a função se ele está retornando um inteiro com código rígido ou um id real.
Da documentação de @IdRes diz:
Indica que um valor de retorno de um número inteiro é esperado para ser uma referência de recursos de id (e.g. android. R. id. copy).
Também a anotação apenas existe no código fonte da documentação. Após o Código ser compilado, a anotação será removida.
Num caso (@IdRes
estás a chamar um método da API (View.setId()
),
enquanto no outro, você está chamando um método em seu próprio código.
Além disso getViewId()
não está anotado, por isso não é óbvio a partir da assinatura que tipo de int ele retorna.
Com os seguintes métodos:
private int getUndefinedRes() {
...
}
private @IdRes int getIdRes() {
...
}
private @StringRes int getStringRes() {
...
}
private void setMyString(@StringRes int resourceString) {
}
private void setMyId(@IdRes int resourceId) {
}
Os resultados das inspecções são (a partir do Android Studio 2.3.3):
// API method with definitely wrong value (constant)
// --> ERROR
new View(context).setId(100);
new TextView(context).setText(100);
// API method with definitely wrong value (from method declaration)
// --> ERROR
new View(context).setId(getStringRes());
new TextView(context).setText(getIdRes());
// API method with potentially wrong value
// --> ok
new View(context).setId(getUndefinedRes());
new TextView(context).setText(getUndefinedRes());
// own method with potentially wrong value
// --> ERROR
setMyString(getUndefinedRes());
setMyId(getUndefinedRes());
Parece que o cotão só olha para a assinatura do método.
Também é mais brando quando se chama uma API método: ele mostra um erro apenas se for óbvio que você está fazendo algo errado. Acho que é porque fazer o contrário forçaria toda a gente a adicionar muitas anotações.
Por outro lado, quando você adiciona anotações no seu código, você está optando pela severidade adicional.