RequestLayout() не действует при вызове onSizeChanged()? - программирование
Подтвердить что ты не робот

RequestLayout() не действует при вызове onSizeChanged()?

У меня есть представление, отображающее тексты и изображения в столбцах в горизонтальном прокручиваемом окне. Он переплачивает и, следовательно, (по крайней мере потенциально) изменяет размеры себя по мере изменения его содержимого; он также переплачивает и изменяет размеры (поддерживая примерно постоянную площадь), когда мягкая клавиатура приходит и уходит, а высота представления изменяется.

Я обнаружил, что работает requestLayout() (в том смысле, что он вызывает вызов для моего onMeasure() перегрузка) большую часть времени... но не при вызове из onSizeChanged().

Мне удалось обойти это post() Runnable, который вызвал requestLayout(), а затем post() ed другой Runnable, который вызвал мой код, который должен запускаться после onMeasure()... но это кажется немного хрупким (я не хочу чтобы добавить задержку, но я хочу быть уверенным, что мой второй Runnable выполняется после async onMeasure()), и, возможно, потому, что он делает так много проходов через цикл событий, экран слишком сильно мигает.

Есть ли какой-то способ - в onSizeChanged() - заставить a onMeasure() (и, возможно, другое onSizeChanged()) произойти до следующего OnDraw()?

4b9b3361

Ответ 1

Я бы предложил сделать класс обратно, возможно, два

    interface ImGonnaTellClassBThatClassAdidFinished(){

              void ClassHasFinishedProcessing(String YaySuccess);

              void ClassHasFailedProcessing();    

              void SomethingWackaDoodleHappened(String SomeShyte);       
              }

Затем перегрузите класс, когда вам это нужно, чтобы выполнять функции

     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);
     }

Убедитесь, что вы перезвонили, когда закончили

     class ActivityB(){

     public void hereYouGo(ImGonnaTellClassBThatClassAdidFinished finished){
     String itWorked = new String("Hooray");
     finished.ClassHasFinishedProcessing(itWorked);
     }
 }

Надеюсь, это поможет, удачи в ваших усилиях.

Ответ 2

Реализация представления имеет метод обратного вызова onlayout, который позволяет изменять дочерние представления и расположение представления внутри родительского макета.

Ответ 3

Я решил проблему, отложив вызов следующим образом:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    post(() -> someMethod());
}