Có cách nào để thay đổi giá trị android: windowSoftInputMode từ lớp java không?


82

Tôi muốn điều khiển các tab của mình để có các windowSoftInputModethuộc tính khác nhau cho mỗi tab. Làm cách nào để truy cập thuộc tính này từ lớp java khi tất cả việc xử lý tab của bạn được thực hiện từ một hoạt động duy nhất?

Có cách nào để truy cập thuộc tính tệp kê khai này từ mã java không?

Câu trả lời:


124

Sử dụng phần sau để thay đổi softInputMode cho một Hoạt động.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Sử dụng phần sau để thay đổi loại softInput cho một EditText.

mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Cảm ơn @Eliezer đã chỉnh sửa


20
Cảm ơn vì phương thức setSoftInputMode này ... Nó thực sự đã giúp tôi ... Thông tin bổ sung: Để truy cập các thuộc tính như adjustPanadjustResizebạn có thể truy cập WindowManager.LayoutParamslớp, bạn có thể tìm thấy nhiều hằng số hữu ích có thể được sử dụng trong setSoftInputModephương thức
Prasham

7
@SureshBora i kết hợp @ 66CLSjY câu trả lời và @aman và tôi cuối cùng đã nhận điều này: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);Tôi đã thử nghiệm nó, và thực sự hoạt động
Humberto Castañeda

1
Làm thế nào đây là câu trả lời chính xác? Theo developer.android.com/reference/android/view/…, các giá trị chấp nhận được duy nhất để vượt qua Window#setSoftInputModeWindowManager.LayoutParams.SOFT_INPUT_*
Eliezer.

4
@ 66CLSjY Nó không hiệu quả với tôi. Bạn có thể cho tôi biết tôi còn thiếu gì không? Tôi gọi điều này là bên trong một hoạt động: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);Nhưng bàn phím vẫn đẩy FrameLayout của tôi lên, nằm trên các chế độ xem khác. Nhưng chỉ có vậy, các quan điểm khác vẫn ở nguyên vị trí của chúng. Nó hoạt động khi tôi thêm nó vào Manifest, nhưng tôi không muốn áp dụng nó cho toàn bộ Activity.
Tamás Kozmér

1
Bạn đã gọi setSoftInputMode trước setContentView trong onCreate ()?
AjOnFire

36

Theo bình luận của Prasham , tôi đã làm điều này và nó đã cứu mạng tôi, nhờ anh ấy! Các EditTextSoftWindowInputchế độ khá buggy khi bạn có một bố trí với ScrollViewvà bạn đang làm đầy nó tự động.

Vì tôi đã xem qua bài đăng này nhưng vẫn tiếp tục đọc các câu trả lời / nhận xét khác (như của Prashan), tôi quyết định viết nó trong một bài đăng mới.

Dưới mã tôi đã sử dụng với của mình ScrollView:

Activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

7
xin chào aman, hơi khó đọc câu trả lời của bạn ở đây. Tôi có thể thấy bạn rất biết ơn Prashan, nhưng bạn có thể vui lòng xóa một số nhận xét cá nhân và chỉ giải thích đoạn mã này sẽ giúp giải quyết vấn đề gì không? cảm ơn.
Taryn East

1
Hm, không hoạt động, ít nhất là để thiết lập để điều chỉnh chảo. Nó chỉ hoạt động nếu tôi đặt nó trong tệp kê khai.
Ixx

Đây là sự cố ứng dụng.
Farrakh Javed

10

Tôi muốn sử dụng hai chế độ khác nhau cho các tab. Các chế độ là SOFT_INPUT_ADJUST_RESIZESOFT_INPUT_ADJUST_NOTHING.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Dòng mã trên chỉ đơn giản là không tự hoạt động. Ứng dụng luôn hoạt động trong một trạng thái ADJUST_NOTHING. Tuy nhiên, nếu windowSoftInputMode="adjustResize"được chèn vào <activity>thẻ trong tệp AndroidManifest.xml, cửa sổ ứng dụng được thay đổi kích thước như mặc định. Ngoài ra, khi bạn gọi đến đường dây sau

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

nó sẽ hoạt động như mong đợi và không có gì được thay đổi kích thước.

PS cải thiện câu trả lời


1
Tôi cần phải xáo trộn giữa RESIZE và NOTHING, làm thế nào có thể làm như vậy một khi tôi quay lại trạng thái không có gì theo chương trình, nó không thay đổi để thay đổi kích thước.
Taranmeet Singh

1
Đây là một quan sát thực sự tốt đẹp. Về cơ bản, thiết lập windowSoftInputMode="adjustResize"trong tệp kê khai sẽ giúp xử lý cờ này sau này. Đặc biệt là trong một tình huống mà bạn có hầu hết các Phân đoạn trong Hoạt động Đơn lẻ. Vì vậy, người ta có thể tiếp tục thay đổi trạng thái đầu vào của Activity một cách linh hoạt bằng cách chuyển đổi theo chương trình từ SOFT_INPUT_ADJUST_RESIZE trở lại SOFT_INPUT_ADJUST_NOTHING theo yêu cầu. Đẹp quá!
sud007

0

Bạn có thể sử dụng mã sau theo chương trình

android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Cảm ơn Deepak


0

Trong Xamarin Android, bạn có thể làm như thế này theo chương trình

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.DetailDesign);
             Window.SetSoftInputMode(SoftInput.AdjustPan);
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.