最近在做一个社交APP,其中有搜索功能。想想这能有什么难的呢?顶多有一个保存历史记录,键入关键词的时候,进行提示罢了。奇葩的问题就出现了,当一次出现搜索结果后,文本编辑框再次获取焦点,键盘怎么都不能弹出来。我仔细的观察了一下,有以下情况的时候,键盘还能弹出来:
1.拉下通知栏(即使不全部拉下来);
2.跳转到下一个页面,再返回;
应该是调用Activity的onPause,onResume等,对键盘产生了影响。接着搜索安卓中的键盘管理机制,未果。开始了下面的大胆尝试:
1.在用户点击文本编辑框的时候,自动调用Activity的生命周期:
SearchActivity.this.onPause();
SearchActivity.this.onStop();
SearchActivity.this.onRestart();
SearchActivity.this.onResume();
Intent intent = new Intent(SearchActivity.this,
SearchTempActivity.class);
startActivity(intent);
正当我为此自鸣得意的时候,问题出现了,有时候,第二次点击无效(是第二次有效后,其他基本没有问题),这样不行啊。
2.让搜索页面真的跳转到某个页面,然后返回,但是不让用户察觉(将下一个页面的可见性设置为不可见)。当用户返回后,进行键盘的弹出操作,就ok了。下面是相关代码:
case R.id.et_search: {
Intent intent = new Intent(SearchActivity.this,
SearchTempActivity.class);
startActivity(intent);
}
break;
/**
* 为了解决搜索页面,键盘不能够及时弹出的一个临时页面
*
* @author Chuanhang.Gu
*
*/
public class SearchTempActivity extends Activity {
ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//随便写一个布局文件即可,将可见性设置为gone
setContentView(R.layout.act_search_temp);
}
@Override
protected void onResume() {
super.onResume();
this.finish();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 由于键盘弹出一次后,只有onStop之后才能继续出现(但是直接调用onStop不是太好使)
//一个弹出键盘的方法(详情见下文)
FileUtil.keyboardShow(SearchActivity.this, mSearchCondition);
}
/**
*
* @param context
* 可以传applicationContext
* @param view
* 正在取得输入焦点的View 一般为EditText;
*/
public static void keyboardShow(Context context, View view) {
inputMethodShow(context, view);
}
public static void inputMethodShow(Context context, View view) {
view.requestFocus();
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
到此奇葩解决键盘不弹出问题结束。