android - por - requestLayout() no tiene efecto cuando se llama desde onSizeChanged()?
llamadas telefonicas por internet (3)
Tengo una vista que muestra textos e imágenes en columnas, en una ventana de desplazamiento horizontal. Refleja y, por lo tanto, (al menos potencialmente) cambia su tamaño a medida que cambia su contenido; también se reajusta y cambia de tamaño (manteniendo un área aproximadamente constante) cuando el teclado suave va y viene y la altura de la vista cambia.
Lo que descubrí fue que la llamada a requestLayout() funciona (en el sentido de que sí onMeasure() una llamada a mi sobrecarga onMeasure() ) la mayor parte del tiempo ... pero no cuando se llama desde mi controlador onSizeChanged() .
Pude evitar esto al post() un Runnable que se llamó requestLayout()
y luego post()
otro Runnable
que llamó a mi código que debe ejecutarse después de onMeasure()
... pero esto parece un poco frágil ( No quiero agregar un retraso, pero quiero asegurarme de que mi segundo Runnable
se ejecute después de async onMeasure()
) y, tal vez porque hace muchos pases a través del bucle de eventos, la pantalla parpadea demasiado.
¿Hay alguna forma, en un onSizeChanged()
, para forzar un onMeasure()
(y, probablemente, otro onSizeChanged()
) para que ocurra antes del próximo onDraw() ?
La implementación de la vista tiene un método de devolución de llamada onlayout que le permite modificar las vistas secundarias y el posicionamiento de la vista dentro del diseño principal.
Resolví el problema posponiendo la llamada de esta manera:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
post(() -> someMethod());
}
Yo sugeriría hacer una llamada de regreso de clase, tal vez dos
interface ImGonnaTellClassBThatClassAdidFinished(){
void ClassHasFinishedProcessing(String YaySuccess);
void ClassHasFailedProcessing();
void SomethingWackaDoodleHappened(String SomeShyte);
}
Luego sobrecargue la clase cuando la necesite para realizar funciones
public class FunctionA{
ImGonnaTellClassBThatClassAdidFinished someName = new ImGonnaTellClassBThatClassAdidFinished(){
@Override
void ClassHasFinishedProcessing(String YaySuccess){
//Well I should Call class B with the info then
//Heres Sting YaySuccess, Use it in the right way
}
void ClassHasFailedProcessing(){
//Well I failed and should let someone know
}
void SomethingWackaDoodleHappened(String SomeShyte){
//Well Something else happened and I have some info on it
}
//Dont forget to pass it to the class
ClassB doWorkMeow = new ClassB();
doWorkMeow.hereYouGo(someName);
}
Asegúrate de volver a llamar cuando hayas terminado.
class ActivityB(){
public void hereYouGo(ImGonnaTellClassBThatClassAdidFinished finished){
String itWorked = new String("Hooray");
finished.ClassHasFinishedProcessing(itWorked);
}
}
Espero que esto ayude, buena suerte en tu esfuerzo.