ViewTreeObserver.OnGlobalLayoutListener দিয়ে কীবোর্ড স্টেট ডিটেক্ট
অ্যান্ড্রয়েডে কীবোর্ড ভিজিবল কিনা চেক করার কোনো ডাইরেক্ট API নেই। সাধারণ পদ্ধতি: রুট ভিউর হাইট পরিবর্তন পর্যবেক্ষণ করা।
বাস্তবায়ন
public class MainActivity extends AppCompatActivity {
private ConstraintLayout rootView;
private EditText etInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = findViewById(R.id.rootview);
etInput = findViewById(R.id.etInput);
Button btn = findViewById(R.id.btnHideKeyboard);
etInput.requestFocus();
showKeyboard(etInput);
// গ্লোবাল লেআউট লিসেনার
rootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int screenHeight = rootView.getRootView().getHeight();
int keypadHeight = screenHeight - r.bottom;
// 15% এর বেশি হাইট থাকলে কীবোর্ড ওপেন মনে করা হয়
boolean isKeyboardVisible = keypadHeight > screenHeight * 0.15;
runOnUiThread(() -> {
if (isKeyboardVisible) {
Log.d("Keyboard", "Keyboard is SHOWING");
} else {
Log.d("Keyboard", "Keyboard is HIDDEN");
}
});
});
btn.setOnClickListener(v -> hideKeyboard(v));
}
private void hideKeyboard(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (imm != null) imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
private void showKeyboard(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (imm != null) imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
}
@Override
protected void onDestroy() {
super.onDestroy();
// লিসেনার রিমুভ করুন (ল্যাম্বডায় রিমুভ করা কঠিন, নামড ক্লাস ব্যবহার করুন)
}
}
কিভাবে কাজ করে
getWindowVisibleDisplayFrame(r)— স্ক্রিনের ভিজিবল এরিয়ার (কীবোর্ড বাদে) রিক্টে ফেলে।screenHeight - r.bottom— কীবোর্ডের ước অনুমানিক হাইট।- যদি হাইট স্ক্রিন হাইটের ১৫%+ হয়, ধরে নেওয়া হয় কীবোর্ড ওপেন।
সতর্কতা
- ন্যাভিগেশন বার, স্ট্যাটাস бар, জেস্ট ন্যাভিগেশন হ্যান্ডেলিং এফেক্ট করতে পারে।
- লিসেনার
onDestroy-এ রিমুভ করুন (লিক এড়াতে)। - এমুলেটরে আচরণ রিয়েল ডিভাইস থেকে ভিন্ন হতে পারে।
আধুনিক বিকল্প: WindowInsetsCompat / WindowInsetsAnimationCompat (API 30+) ব্যবহার করুন আরও নির্ভরযোগ্য ফলাফলের জন্য।