SearchView Get focus and pop soft keyboard


使用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));




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值