2014-10-15 26 views
6

Tôi đã có một DialogFragment, thường nằm ở giữa màn hình, tôi đang cố di chuyển ra khỏi bàn phím trên màn hình, nếu có, vì nó không phải là trải nghiệm UX tốt cho bàn phím để che phủ trên các phần của cửa sổ khi hoàn toàn không sử dụng màn hình bất động sản xa hơn.Animate Window Layout Thay đổi

Giả sử tôi đã giải quyết được vấn đề phát hiện bàn phím xuất hiện hoặc biến mất, ví dụ: How to check visibility of software keyboard in Android?.

Hiện nay tôi đi đến di chuyển cửa sổ ra khỏi đường đi bằng cách làm một cái gì đó như thế này:

... 
final WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 
params.gravity = Gravity.TOP; 
params.verticalMargin = .1f; //or whatever 
dialog.getWindow().setAttributes(params); 
... 

này hoạt động tốt, nhưng cửa sổ đột nhiên giật vào đúng vị trí, mà không phải là một trải nghiệm UX dễ chịu. Cửa sổ được đề cập có hoạt ảnh nhập cảnh và thoát thành công - và chúng thậm chí còn hoạt động phù hợp sau khi thay đổi bố cục cửa sổ. Làm thế nào tôi có thể làm sống động thêm cửa sổ giữa các thay đổi WindowManager.LayoutParams?

(Tôi muốn nếu có thể tiếp tục làm việc theo cách bố trí {/}} {trong} http://developer.android.com/reference/android/view/Window.html thay vì, giả sử, buộc DialogFragment vào bố cục hoạt động của tôi và làm động nó từ bên trong).

+1

Trong AndroidManifest của bạn, bạn đã thử thêm 'android: windowSoftInputMode =" stateHidden | adjustPan "' vào thẻ hoạt động của bạn? Điều đó có thể giữ cho chế độ xem đang hoạt động được hiển thị tự động. Tôi có xu hướng sử dụng điều này cho các tính năng khác, nhưng chưa thử với DialogFragment. – Anonsage

+1

Tôi đã thử điều đó trước đây, và tôi đã thử lại lần nữa để đảm bảo. Nó dường như chỉ ảnh hưởng đến chế độ xem Gốc hoạt động (DecorView), không phải bất kỳ Windows nào khác và quan điểm của chúng. Tôi thấy các hoạt động điều chỉnh cho bàn phím (và không có hoạt hình quá, tâm trí bạn) trong nền, nhưng cửa sổ chỉ nổi ở đó không thay đổi. Ngoài ra, trong trường hợp ai đó khác bị cám dỗ đề xuất nó, vâng tôi cũng đã thử "window.setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);" trong DialogFragment. – jdowdell

+0

@jdowdell Sử dụng 'DialogFragment' để thay thế. –

Trả lời

2

Tôi không có thời gian chờ đợi tiền thưởng hết hạn, vì vậy tôi đã mã hóa khoảng cách dừng dưới đây cho đến khi tôi có thể có giải pháp tốt hơn. Trong trường hợp nó giúp bất kỳ ai khác, hoặc cung cấp cho họ một ý tưởng cho một câu trả lời tiền thưởng xứng đáng, đây là những gì tôi đã làm. Tuy nhiên, tôi nghi ngờ nó không hiệu quả như tất cả các địa ngục, vì tôi giả sử nó buộc một cửa sổ chuyển tiếp mọi khung hình hoạt hình hơn là chỉ quét một bitmap trên màn hình. Đây không phải là tất cả của nó tất nhiên, nhưng là bit quan trọng:

// Not shown: setting currentVerticalMargin, targetVerticalMargin, or calling this method 
private synchronized void restartVerticalMarginAnimator() { 
    if (verticalMarginAnimator != null) { 
     return; 
    } 
    final Dialog dialog = this.getDialog(); 
    if (dialog == null) { 
     return; 
    } 
    final WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 
    verticalMarginAnimator = new TimeAnimator(); 
    verticalMarginAnimator.setTimeListener(new TimeListener() { 
     @Override 
     public void onTimeUpdate(TimeAnimator a, long totalTime, long deltaTime) { 
      float stretch = targetVerticalMargin - currentVerticalMargin; 
      float distance = WINDOW_ANIMATION_SPEED * deltaTime/1000L; 
      boolean finished = false; 

      // Adjust distance so it's capped at "going all the way to target" and no further, 
      // and has the right sign if we're animating upward. 
      if (distance > Math.abs(stretch)) { 
       distance = stretch; 
       finished = true; 
      } else if (stretch < 0) { 
       distance *= -1f; 
      } 

      // Move. 
      currentVerticalMargin += distance; 
      if (finished) { 
       verticalMarginAnimator.end(); 
       verticalMarginAnimator = null; 
      } 
      params.verticalMargin = currentVerticalMargin; 
      dialog.getWindow().setAttributes(params); 
     } 
    }); 
    verticalMarginAnimator.start(); 
} 
Các vấn đề liên quan