2013-01-15 20 views
16

Tôi có chế độ xem hiển thị văn bản và hình ảnh trong cột, trong cửa sổ cuộn theo chiều ngang. Nó reflows và do đó (ít nhất là có khả năng) thay đổi kích thước chính nó như là nội dung của nó thay đổi; nó cũng reflows và thay đổi kích thước (duy trì một khu vực gần như không đổi) khi bàn phím mềm đến và đi và chiều cao xem thay đổi.requestLayout() không có tác dụng khi được gọi từ onSizeChanged()?

gì tôi thấy được rằng gọi requestLayout() công trình (theo nghĩa là nó kích hoạt một cuộc gọi đến onMeasure() tình trạng quá tải của tôi) hầu hết thời gian ... nhưng không khi gọi từ handler onSizeChanged() tôi.

tôi đã có thể làm việc này bằng cách post() ing một Runnable mà gọi requestLayout() và sau đó post() ed khác Runnable đó gọi là mã của tôi mà cần phải chạy sau khi onMeasure() ... nhưng điều này có vẻ hơi mỏng manh (tôi không muốn thêm một sự chậm trễ, nhưng tôi muốn chắc chắn rằng Runnable thứ hai của tôi thực hiện sau khi async onMeasure()) và, có lẽ bởi vì nó làm cho rất nhiều đi qua vòng lặp sự kiện, màn hình nhấp nháy quá nhiều.

Có cách nào - trong một số onSizeChanged() - để buộc onMeasure() (và, có thể, một onSizeChanged()) khác sẽ xảy ra trước onDraw() tiếp theo?

+6

Thay vì gọi 'requestLayout()' lần thứ hai (và nó không hoạt động từ 'onSizeChanged()' vì gọi lại này là một phần của quy trình bố trí) tại sao bạn không tính toán kích thước chính xác 'onMeasure()'? –

+0

Tôi làm, và nó hoạt động. Nhưng khi chiều cao thay đổi, tôi reflow - mà thay đổi chiều rộng - và do đó cần phải kích hoạt một cuộc gọi đến 'onMeasure()'. –

+1

Câu hỏi của bạn thực sự đã cho tôi câu trả lời cho một vấn đề tôi vừa có, cảm ơn :) Giải pháp View.post của bạn hoạt động mà không có bất kỳ tác dụng phụ nào đối với tôi. Cảm ơn! –

Trả lời

0

tôi sẽ đề nghị thực hiện một lớp gọi lại, có lẽ hai

interface ImGonnaTellClassBThatClassAdidFinished(){ 

       void ClassHasFinishedProcessing(String YaySuccess); 

       void ClassHasFailedProcessing();  

       void SomethingWackaDoodleHappened(String SomeShyte);  
       } 

Sau đó, quá tải lớp khi bạn cần nó để thực hiện chức năng

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

Hãy chắc chắn rằng bạn gọi lại khi hoàn tất bạn

 class ActivityB(){ 

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

Hy vọng điều này sẽ giúp, Chúc may mắn trong nỗ lực của bạn.

0

Việc thực hiện xem có một phương pháp onlayout gọi lại cho phép bạn thay đổi quan điểm trẻ em và vị trí của các điểm bên trong bố trí cha mẹ ..

0

tôi giải quyết vấn đề bằng cách trì hoãn các cuộc gọi như thế này:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    post(() -> someMethod()); 
} 
Các vấn đề liên quan