您的位置:首页 > 运维架构

SearchView Get focus and pop soft keyboard

2014-03-07 16:02 555 查看
使用SearchView时,会碰到这种情况,就是:你需要控制SearchView的可见状态,并且让它显示时就让它是展开的,并且获取focus和pop soft keyboard。那你就可以考虑一下使用下面的方法来实现。

一、使用new 的方式来创建一个SearchView。
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
SearchView searchView = new SearchView(this);
actionBar.setCustomView(searchView);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
searchView.setQuery("test",true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();

// get focus
mSearchView.requestFocus();
// get soft input
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}


备注:
使用new的方式直接来创建一个SearchView,并使其获得focus并pop soft keyboard,这种方式OK。
但是如果你是使用xml文件来定义MenuItem来引入SearchView的话,那就要注意了:

<item
android:id="@+id/action_find_str_item"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/searchfile"
android:orderInCategory="200"
android:showAsAction="ifRoom|withText"
android:title="@string/action_search"
android:visible="false" />


在android:showAsAction这个属性中你要使用ifRoom,不要使用always,否则只能获取focus但输入光标没出现。

不过,如果你不是想让它一显示就展开的话,上面说的那个问题就不会存在了!

二、在上面的一中,我们使用的是new来创建SearchView,在这里我们使用Xml来定义创建SearchView
我这个例子是使用SearchView对PDF file进行text Search的。我这里

package com.example.actionbardemo;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.SearchView;
import android.widget.SearchView.OnCloseListener;

public class SearchViewDemoActivity extends Activity {

private MenuItem mSearchViewMenuItem;
private SearchView mSearchView;
private Button btn_show;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.searchview_demo_layout);
btn_show = (Button) findViewById(R.id.btn_show_search);
btn_show.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if(mSearchViewMenuItem.isVisible()) {
mSearchViewMenuItem.setVisible(false);
}else {
mSearchViewMenuItem.setVisible(true);

// get focus
mSearchView.requestFocus();
// get soft input
InputMethodManager imm = (InputMethodManager) mSearchView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}

}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.searchview_menu_demo, menu);
mSearchViewMenuItem = menu.findItem(R.id.search_menu_item);
mSearchView = (SearchView) mSearchViewMenuItem.getActionView();

mSearchView.setIconifiedByDefault(false);	// Expand SearchView input box
mSearchView.setFocusable(true);
mSearchView.setQueryHint("Type to Search");
mSearchView.setOnCloseListener(new OnCloseListener() {

@Override
public boolean onClose() {
if(getCurrentFocus()!=null)
{
((InputMethodManager) mSearchView.getContext().getSystemService(INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getCurrentFocus()
.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}

return false;
}
});
return true;
}
}
res/layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/btn_show_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="show_hide" />

</LinearLayout>


res/menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/search_menu_item"
android:menuCategory="alternative"
android:orderInCategory="1"
android:title="Type to search"
android:visible="false"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="ifRoom|withText"/>
</menu>


最后,上面使用的是android.widget.SearchView,是在android sdk 11版本之后使用的。如果之前的话,就要使用到support lib了。sdk 11 之前的例子,待续。。。

=======================================================================================================

补充一下:

如果你要这个需求,就是在searchView的后面增加两个icon。如果你不限定SearchView的长度的话,它会把后面的icon挤掉的(也就是说会把后面的Icon覆盖掉,这样你就看不到了)。

我们可以根据手机屏幕的大小来限定SearchView的宽度:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mSearchView.setMaxWidth((int)(dm.widthPixels * 0.6));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: