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
Author: Rahul, 2017-08-20

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.

 2
Author: Nabin Bhandari, 2017-08-20 16:25:29

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.
 0
Author: bwt, 2017-08-24 13:30:29