Codename One obtém e desativa todos os componentes e subcomponentes
Tenho um aplicativo Android com vários contêineres e outros componentes, como botões e rótulos.
O aplicativo usa pop-ups para informar ao usuário na primeira execução sobre o uso do aplicativo e seus componentes.
Desejo desativar o formulário e / ou todos os componentes e subcomponentes internos, até que o usuário pressione o botão Fechar da caixa de diálogo pop-up.
Tentei usar form.setEnabled (false), mas não funcionou.
form.getComponentCount ()
também obtém apenas os containers e a barra de ferramentas e não o que está dentro dos containers, por isso é insuficiente.
Agora uso o seguinte código para desativar os componentes:
form.setScrollable (false);
for (Component component : containerOne ) {
component.setEnabled(false);
}
for (Component component : containerTwo ) {
component.setEnabled(false);
}
for (Component component : containerThree ) {
component.setEnabled(false);
}
buttonOne.setEnabled(false);
buttonTwo.setEnabled(false);
textFieldOne.setEnabled(false);
textFieldTwo.setEnabled(false);
mas isso exige muito código, já que preciso habilitar os componentes mais tarde e também estou usando várias classes.
Existe uma maneira simples ou mais fácil de conseguir isso?
Respostas
Você pode usar o ComponentSelector para habilitar / desabilitar componentes em uma linha de código.
$("*", rootContainer).setEnabled(false)
- O
$é um pseudônimo deComponentSelector.select() - O "*" é um seletor (semelhante a um seletor CSS) que diz para combinar todos os componentes.
- O
rootContaineré umContainerobjeto que serve como raiz para a seleção. setEnabled(false)conjuntos enabled = false em todos os componentes no conjunto encontrado.
Uma vez que você usa uma caixa de diálogo, desde que ela não mostre nada no formulário, é clicável.
Se você quiser bloquear qualquer coisa, a desativação é problemática porque não é recursiva. Basta substituir o ponteiro pressionado / liberado Forme bloqueá-los condicionalmente. Eles não irão propagar o evento adiante e você pode obter o mesmo efeito sem a alteração do estilo problemático para desativado.
por exemplo:
class MyForm extends Form {
private boolean blockFormEvents;
// ...
@Override
public void pointerReleased(int x, int y) {
if(blockFormEvents) return;
super.pointerReleased(x, y);
}
@Override
public void pointerReleased(int[] x, int[] y) {
if(blockFormEvents) return;
super.pointerReleased(x, y);
}
@Override
public void pointerPressed(int x, int y) {
if(blockFormEvents) return;
super.pointerPressed(x, y);
}
@Override
public void pointerPressed(int[] x, int[] y) {
if(blockFormEvents) return;
super.pointerPressed(x, y);
}
}