हां, कीबोर्ड को दिखाना और छिपाना और कॉल को बैक बटन पर इंटरसेप्ट करना पूरी तरह से संभव है। यह थोड़ा अतिरिक्त प्रयास है क्योंकि यह उल्लेख किया गया है कि एपीआई में ऐसा करने का कोई सीधा तरीका नहीं है। कुंजी boolean dispatchKeyEventPreIme(KeyEvent)एक लेआउट के भीतर ओवरराइड करने के लिए है । हम जो करते हैं वह हमारा लेआउट बनाता है। मैंने RelativeLayout को चुना क्योंकि यह मेरी गतिविधि का आधार था।
<?xml version="1.0" encoding="utf-8"?>
<com.michaelhradek.superapp.utilities.SearchLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.michaelhradek.superapp"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white">
हमारी गतिविधि के अंदर हम अपने इनपुट फ़ील्ड सेट करते हैं और setActivity(...)फ़ंक्शन को कॉल करते हैं।
private void initInputField() {
mInputField = (EditText) findViewById(R.id.searchInput);
InputMethodManager imm =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
mInputField.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
performSearch();
return true;
}
return false;
}
});
SearchLayout.setSearchActivity(this);
}
जाहिर है, initInputField()फ़ंक्शन इनपुट फ़ील्ड सेट करता है। यह कार्यक्षमता को निष्पादित करने के लिए एंटर कुंजी को सक्षम करता है (मेरे मामले में एक खोज)।
@Override
public void onBackPressed() {
DataHelper.cancelSearch();
hideKeyboard();
super.onBackPressed();
}
इसलिए जब onBackPressed()हमारे लेआउट के भीतर कॉल किया जाता है तो हम कीबोर्ड को छिपाने के लिए जो चाहें कर सकते हैं:
private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mInputField.getWindowToken(), 0);
}
वैसे भी, यहाँ RelativeLayout का मेरा ओवरराइड है।
package com.michaelhradek.superapp.utilities;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.RelativeLayout;
public class SearchLayout extends RelativeLayout {
private static final String TAG = "SearchLayout";
private static Activity mSearchActivity;;
public SearchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SearchLayout(Context context) {
super(context);
}
public static void setSearchActivity(Activity searchActivity) {
mSearchActivity = searchActivity;
}
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
Log.d(TAG, "dispatchKeyEventPreIme(" + event + ")");
if (mSearchActivity != null &&
event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP
&& !event.isCanceled() && state.isTracking(event)) {
mSearchActivity.onBackPressed();
return true;
}
}
}
return super.dispatchKeyEventPreIme(event);
}
}
दुर्भाग्य से मैं सभी क्रेडिट नहीं ले सकता। यदि आप त्वरित SearchDialog बॉक्स के लिए एंड्रॉइड स्रोत की जांच करते हैं, तो आप देखेंगे कि विचार कहां से आया है।