package cn.trinea.android.demo;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import android.app.ActionBar;
import android.app.ActionBar.LayoutParams;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.SearchView;
import android.widget.SearchView.OnCloseListener;
import android.widget.TextView;
/**
* SearchViewDemo
*
* @author <a href="http://www.trinea.cn/android/android-searchview-and-search-tips-impl/" target="_blank">Trinea</a>
* 2013-5-9
*/
public class SearchViewDemo extends BaseActivity {
private SearchView searchView;
private MyHandler handler;
// schedule executor
private ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(10);
private String currentSearchTip;
private TextView searchInfo;
private InputMethodManager inputMethodManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.search_view_demo);
inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
handler = new MyHandler();
searchInfo = (TextView)findViewById(R.id.search_info);
// set title style
ActionBar bar = getActionBar();
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_HOME_AS_UP
| ActionBar.DISPLAY_SHOW_CUSTOM);
setTitle(" ");
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View customActionBarView = inflater.inflate(R.layout.search_view_demo_title, null);
searchView = (SearchView)customActionBarView.findViewById(R.id.search_view);
searchView.setVisibility(View.VISIBLE);
searchView.setIconifiedByDefault(true);
searchView.setIconified(false);
if (Build.VERSION.SDK_INT >= 14) {
// when edittest is empty, don't show cancal button
searchView.onActionViewExpanded();
}
searchView.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
// to avoid click x button and the edittext hidden
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
public boolean onQueryTextSubmit(String query) {
searchInfo.setText("search submit result");
hideSoftInput();
return true;
}
public boolean onQueryTextChange(String newText) {
if (newText != null && newText.length() > 0) {
currentSearchTip = newText;
showSearchTip(newText);
}
return true;
}
});
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
Gravity.CENTER_VERTICAL | Gravity.RIGHT);
bar.setCustomView(customActionBarView, params);
// show keyboard
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
public void showSearchTip(String newText) {
// excute after 500ms, and when excute, judge current search tip and newText
schedule(new SearchTipThread(newText), 500);
}
class SearchTipThread implements Runnable {
String newText;
public SearchTipThread(String newText) {
this.newText = newText;
}
public void run() {
// keep only one thread to load current search tip, u can get data from network here
if (newText != null && newText.equals(currentSearchTip)) {
handler.sendMessage(handler.obtainMessage(1, newText + " search tip"));
}
}
}
public ScheduledFuture<?> schedule(Runnable command, long delayTimeMills) {
return scheduledExecutor.schedule(command, delayTimeMills, TimeUnit.MILLISECONDS);
}
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
searchInfo.setText((String)msg.obj);
break;
}
}
}
/**
* hide soft input
*/
private void hideSoftInput() {
if (inputMethodManager != null) {
View v = SearchViewDemo.this.getCurrentFocus();
if (v == null) {
return;
}
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
searchView.clearFocus();
}
}
}