Minha declaração de caso de mudança funciona perfeitamente bem ontem. Mas quando executo o código esta manhã, o eclipse me deu um erro ao sublinhar as instruções de caso em vermelho e diz: expressões de caso devem ser constantes, é constante, não sei o que aconteceu. Aqui está o meu código abaixo:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
Todos os R.id.int estão todos sublinhados em vermelho.
java
android
switch-statement
Arcanjo Sem Coração
fonte
fonte
R.id.playbtn
etc.? Tudo estático e final?R
geralmente é gerada pelas ferramentas IDE / dev, por isso geralmente está correta para a versão do Android em uso.Respostas:
Em um projeto regular do Android, as constantes na classe R do recurso são declaradas assim:
No entanto, a partir do ADT 14, em um projeto de biblioteca, eles serão declarados assim:
Em outras palavras, as constantes não são finais em um projeto de biblioteca. Portanto, seu código não seria mais compilado.
A solução para isso é simples: converta a instrução switch em uma instrução if-else.
http://tools.android.com/tips/non-constant-fields
Você pode converter rapidamente uma
switch
declaração em umaif-else
declaração usando o seguinte:No Eclipse
Mova o cursor para a
switch
palavra - chave e pressione Ctrl+ 1e selecioneNo Android Studio
Mova o cursor para a
switch
palavra - chave e pressione Alt+ Entere selecionefonte
final
palavra - chave, uma variável pode ser alterada em tempo de execução.Desmarcar "Is Library" nas propriedades do projeto funcionou para mim.
fonte
A solução pode ser feita da seguinte maneira:
Exemplo:
Espero que isso ajude você.
fonte
R.id. *, uma vez que o ADT 14 não é mais declarado como int estático final, portanto você não pode usá-lo na construção de caso de switch. Você pode usar a cláusula if else.
fonte
A solução simples para esse problema é:
Clique no comutador e pressione CTL + 1. Ele mudará o comutador para a declaração de bloco if-else e resolverá o problema.
fonte
Que tal essa outra solução para manter a boa opção em vez de um if-else:
Portanto, no seu código, você pode fazer isso:
As enums são estáticas, portanto, isso terá um impacto muito limitado. A única janela de preocupação seria a pesquisa dupla envolvida (primeiro no SparseArray interno e depois na tabela de comutadores)
Dito isto, esse enum também pode ser utilizado para buscar os itens de maneira fluente, se necessário, mantendo uma referência ao id ... mas isso é uma história para outra hora.
fonte
Ele estava me lançando esse erro quando utilizava o switch em uma função com variáveis declaradas na minha classe:
O problema foi resolvido quando eu declarei
final
para as variáveis no início da classe:fonte
enum
é uma alternativa melhor paraint
neste caso. O chamador do método não poderá chamar a função com tipo inválido.i have specific int types so its ok if i use ints
Realmente não faz sentido. Em relação ao exemplo de enum: docs.oracle.com/javase/tutorial/java/javaOO/enum.htmli mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anything
Esta é a sua suposição. Outra pessoa pode chamar a função incorretamente com número arbitrário. Comenum
, você não precisa assumir, ele é imposto pelo idioma.Gostaria de mencionar que me deparei com a mesma situação quando tentei adicionar uma biblioteca ao meu projeto. De repente, todas as instruções do switch começaram a mostrar erros!
Agora eu tentei remover a biblioteca que adicionei, mesmo assim não funcionou. como sempre " quando eu limpei o projeto " todos os erros foram disparados!
fonte