2010-08-25 38 views
20

Heres các tiến thoái lưỡng nan: Tôi đang hiển thị màn hình với 3 trường nhập liệu và 2 nút bên trong một tab (có tổng số 3 tab và chúng nằm ở cuối màn hình). 2 nút được đặt ở dưới cùng bên trái và bên phải của màn hình, ngay phía trên các tab. khi tôi nhấp vào trường nhập, các tab và nút đều được đẩy lên trên đầu bàn phím.Android: làm cách nào tôi có thể biết liệu bàn phím mềm có đang hiển thị hay không?

tôi chỉ muốn đẩy các nút lên và rời khỏi các tab ban đầu, ở phía dưới cùng. tôi đang nghĩ đến việc thiết lập khả năng hiển thị của các tab GONE khi tôi xác định rằng bàn phím mềm đang hiển thị và khả năng hiển thị sẽ hiển thị khi bàn phím mềm đã biến mất.

có một số loại người nghe cho bàn phím mềm hoặc có thể là trường nhập liệu? có thể một số sử dụng khéo léo của OnFocusChangeListener cho văn bản chỉnh sửa? Làm cách nào tôi có thể xác định liệu bàn phím có hiển thị hay không?

+0

Kiểm tra này ra: http://stackoverflow.com/questions/4745988/how-do-i-detect-if-software-keyboard-is-visible-on-android-device/31090451#31090451 Hoạt động tốt cho tôi. –

+0

Bản sao có thể có của [Cách kiểm tra khả năng hiển thị của bàn phím phần mềm trong Android?] (Http: // stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android) – afathman

Trả lời

5

Xác định xem bàn phím có đang hiển thị không hiển nhiên.

Bạn có thể muốn vô hiệu hóa tất cả với thẻ windowSoftInputMode xml trong tệp kê khai của mình: http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode. Hoặc bạn có thể xem cách xóa tiêu điểm để ẩn bàn phím: Hide soft keyboard on activity without any keyboard operations.

Không chính xác sẽ giải quyết vấn đề của bạn. Tôi nhớ đọc một blogpost mạnh mẽ khuyên không sử dụng các tab ở phía dưới, chứ không phải là trên cùng của màn hình, vì lý do rõ ràng UI. Tôi khuyên bạn nên theo dõi điều đó.

+1

Vẫn chưa xác định được liệu bàn phím mềm có được hiển thị không? Năm năm trôi qua kể từ ... –

0

này có thể giúp http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html

https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/java/src/com/android/inputmethod/latin

Mã bàn phím là ở đây, tôi grepped qua nó một chút nhưng từ bỏ, tôi không thấy bất kỳ chương trình truyền hình được gửi đó sẽ là của bất kỳ sử dụng, ít nhất là ở đây. Có lẽ bạn có thể đi tìm mã cấp thấp hơn trong repo và tìm một Intent hữu ích đang được gửi đi. Các linke đầu tiên có thể cho bạn biết khi nó trở nên có thể nhìn thấy, nhưng tôi không chắc chắn làm thế nào để biết khi nào nó trở nên vô hình.

-5

Trong ứng dụng cuối cùng của tôi, tôi đã có một số vấn đề trong việc hiển thị bàn phím mềm, sau đó tôi đã sử dụng đoạn mã sau vào tập tin Manifest của tôi:

<activity android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" android:name=".rate.Calculator"/>

1

Theo như tôi biết, bạn không thể.

Tuy nhiên, bạn có thể theo dõi thay đổi kích thước bố cục và vì bàn phím hiển thị là nguyên nhân chính để thay đổi kích thước, bạn có thể giả định rằng bàn phím được hiển thị hay không.

Dưới đây là mã mẫu để theo dõi thay đổi kích thước bố cục. Chỉ cần sử dụng bố cục này làm bố cục gốc của bố cục ban đầu của bạn và sử dụng trình nghe của nó. Nếu chiều cao đã giảm, bạn có thể giả sử bàn phím được hiển thị và nếu nó được tăng lên, bạn có thể cho rằng nó đã bị đóng.

public class LayoutSizeChangedSensorFrameLayout extends FrameLayout { 
    public enum SizeChange { 
     HEIGHT_INCREASED, HEIGHT_DECREASED, WIDTH_INCREASED, WIDTH_DECREASED 
    } 

    public interface OnLayoutSizeChangedListener { 
     void onSizeChanged(EnumSet<SizeChange> direction); 
    } 

    private OnLayoutSizeChangedListener mLayoutSizeChangeListener; 

    public LayoutSizeChangedSensorFrameLayout(final Context context) { 
     super(context); 
    } 

    public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attributeSet) { 
     super(context, attributeSet); 
    } 

    public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     if (mLayoutSizeChangeListener != null) { 
      final EnumSet<SizeChange> result = EnumSet.noneOf(SizeChange.class); 
      if (oldh > h) 
       result.add(SizeChange.HEIGHT_DECREASED); 
      else if (oldh < h) 
       result.add(SizeChange.HEIGHT_INCREASED); 
      if (oldw > w) 
       result.add(SizeChange.WIDTH_DECREASED); 
      else if (oldw < w) 
       result.add(SizeChange.WIDTH_INCREASED); 
      if (!result.isEmpty()) 
       mLayoutSizeChangeListener.onSizeChanged(result); 
     } 
    } 

    public void setOnLayoutSizeChangedListener(final OnLayoutSizeChangedListener layoutSizeChangeListener) { 
     this.mLayoutSizeChangeListener = layoutSizeChangeListener; 
    } 

    public OnLayoutSizeChangedListener getOnLayoutSizeChangeListener() { 
     return mLayoutSizeChangeListener; 
    } 
} 
Các vấn đề liên quan