Às vezes, o usuário precisa mostrar um prompt quando os dados necessários estão faltando. Por exemplo, uma lista vazia, um erro do servidor ou nenhuma conexão com a Internet. O que deve ser feito no caso em que a dica deve ser complexa e diferente para cada um dos casos? A implementação abaixo deve abordar esses problemas.
O resultado final é que o dever de exibir informações auxiliares é atribuído a um objeto separado. Isso fornece uma separação mais correta da lógica e menos código na atividade. Vamos prosseguir para uma descrição mais detalhada da implementação.
Cada dica é um fragmento separado que pode conter qualquer coisa. Para gerenciá-los, o objeto precisa de um FragmentManager e do Id do contêiner no qual os fragmentos devem residir. Não há mais dependências.
Cada situação é um elemento de enumeração (tudo ficará muito claro com o código) aninhado neste objeto. Quando uma dica precisar ser alterada, será chamado o método responsável pela substituição, para o qual será passada a nova situação. Tudo isso é lógico.
Agora, isso deve ser feito na realidade do Android. Exceto pela própria atividade (ou fragmento), que precisa de um objeto, ninguém mais se referirá a ele. Existe um estado inicial "Padrão". Ele será exibido na primeira vez em que aparecer, até que um novo valor apareça. Os próprios valores são armazenados em LiveData (que está no ViewModel), ao qual a atividade se inscreve e passa cada novo para o objeto. Isso permite que você experimente a recriação da atividade e mantenha o estado.
Decidi usar códigos de status HTTP como exemplo, mas qualquer um pode ser usado. Por exemplo, ao consultar um banco de dados de filmes com condições sobre data de lançamento, diretor, atores, etc. pistas diferentes podem ser mostradas: não há ator obrigatório, nenhum filme nesta data, este diretor não tem tais filmes, etc.
Nuances
Se, por exemplo, você não limpar a lista de dados, então a dica pode ser exibida acima (ou abaixo) desta lista, que será feia. Para fazer isso, primeiro você deve limpar a lista (ou ocultar sua visibilidade, o que é melhor?).
Implementação
CodeSwitcher.
CodeSwitcher. Não consegui pensar em um nome adequado.
//
public class CodeSwitcher {
//
public enum Code {
DEFAULT,
HTTP_OK,
HTTP_CREATED,
HTTP_BAD_REQUEST,
HTTP_NOT_FOUND,
NO_DATA
}
//
private FragmentManager fragmentManager;
private int fragmentHostId;
public CodeSwitcher(FragmentManager fragmentManager, int fragmentHostId) {
this.fragmentManager = fragmentManager;
this.fragmentHostId = fragmentHostId;
}
//,
public void switchFragments(Code code) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (code) {
case HTTP_OK:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_OK"));
break;
case HTTP_CREATED:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_CREATED"));
break;
case HTTP_BAD_REQUEST:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_BAD_REQUEST"));
break;
case HTTP_NOT_FOUND:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_NOT_FOUND"));
break;
case NO_DATA:
transaction.replace(fragmentHostId, CodeFragment.newInstance("NO_DATA"));
break;
default:
transaction.replace(fragmentHostId, CodeFragment.newInstance("Default"));
break;
}
transaction.commit();
}
}
// ViewModel
//
public CodeShowActivityViewModel() {
listCode = new MutableLiveData<>();
listCode.setValue(CodeSwitcher.Code.DEFAULT);
}
// , ,
public void httpOk() {
listCode.setValue(CodeSwitcher.Code.HTTP_OK);
clearList();
}
public void httpBadRequest() {
listCode.setValue(CodeSwitcher.Code.HTTP_BAD_REQUEST);
clearList();
}
// ,
private CodeSwitcher switcher;
// onCreate()
switcher = new CodeSwitcher(getSupportFragmentManager(), R.id._);
// LiveData,
codeActVM.getListCode().observe(this, code -> {
switcher.switchFragments(code);
});
GIF (4 MB) com descrição
Desde o início, um estado padrão aparece, é especialmente exibido em segundo plano, mas na realidade deveria estar vazio. Então, o recebimento de vários códigos e sua exibição são emulados. Ao final, é mostrado que o estado persiste mesmo quando a atividade é recriada.
O que você acha deste método?
PS
Problemas com os nomes ...