Como comparar dois drawables, estou fazendo assim, mas não estou tendo sucesso
public void MyClick(View view)
{
Drawable fDraw = view.getBackground();
Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover);
if(fDraw.equals(sDraw))
{
//Not coming
}
}
Respostas:
Atualize https://stackoverflow.com/a/36373569/1835650
getConstantState () não funciona bem
Existe outra maneira de comparar:mRemeberPwd
é umImageView
neste exemplo. Se você estiver usando umTextView
, use em seugetBackground().getConstantState
lugar.fonte
Depender
getConstantState()
sozinho pode resultar em falsos negativos .A abordagem que usei é tentar comparar ConstantState na primeira instância, mas recorrer a uma comparação de bitmap se a verificação falhar.
Isso deve funcionar em todos os casos (incluindo imagens que não são recursos), mas observe que consome muita memória.
fonte
getConstantState()
comparaçãosetBounds
edraw
em uma cópia em vez do stackoverflow.com/a/25462223/1916449Minha pergunta era apenas para comparar dois drawables, tentei, mas não consegui nenhum método que comparasse diretamente dois drawables, no entanto, para minha solução, mudei o drawable para bitmap e depois comparei dois bitmaps e está funcionando.
fonte
para SDK 21+
isso funciona no SDK -21
para SDK +21 android 5. definir id drawable para imageview com tag
e compare assim
esta solução é para quem deseja comparar
drawable
id deimageview
com id dedrawable.xxx
.fonte
A solução para Android 5:
fonte
getDrawable (int) agora está obsoleto. Use getDrawable (context, R.drawable.yourimageid)
Para comparar dois fundos
fonte
context.getResources().getDrawable(R.drawable.***)
no Android 6+, mas não no Android 5. Com essa pequena mudança, posso comparar drawables em segundo plano em todas as versões do Android perfeitamentetalvez tente desta forma:
ou prepare um método que receba dois argumentos drawable e retorne booleano. Nesse método, você pode converter drawable em bytes e comparar,
fonte
e.g R.drawable.abc
dois parâmetros?Ok, acho que encontrei a solução definitiva para isso. Por causa de AppCompat e amigos, o drawable fornecido às vezes é inflado em diferentes formas, portanto, não é suficiente
getResources().getBitmap(R.drawable.my_awesome_drawable)
.Portanto, para obter uma instância drawable do mesmo tipo e forma fornecida pela visualização, pode-se fazer o seguinte:
Isso é útil ao fazer testes. No entanto, eu não recomendaria fazer isso na produção. Se necessário, um cache extra seria desejável para evitar fazer muita reflexão.
Para testes do Expresso, você pode usar isso muito bem:
ou
Antes, você terá que declarar esta classe auxiliar:
fonte
fonte
Já respondi sobre um tópico semelhante aqui: Obtenha o ID de um drawable em ImageView . A abordagem é baseada na marcação de uma visualização com um ID de recurso especificado no custom
LayoutInflater
. Todo o processo é automatizado por uma biblioteca simples TagView .Como resultado, você pode comparar dois drawables apenas por seus ids:
fonte
Expandindo a resposta de @vaughandroid, o Matcher a seguir funciona para um Drawable de vetor colorido. Você deve fornecer a tonalidade que foi usada para o Drawable.
fonte
Compare 2 drawable:
Se você não consegue encontrar
Drawable.toBitmap(...)
aqui é Drawable.ktfonte
se você deseja comparar diretamente dois drawable, use o seguinte código
Drawable fDraw = getResources (). GetDrawable (R.drawable.twt_hover);
Drawable sDraw = getResources (). GetDrawable (R.drawable.twt_hover);
fonte
Quando você está usando o
equals()
método, ele é usado para comparar o conteúdo. você deve tentar==
comparar dois objetos.fonte