packagecom.nf.android_menu_2;importandroid.app.ActionBar;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.widget.SearchView;importandroid.widget.TextView;importjava.lang.reflect.Method;public class Main2Activity extendsActivity {privateTextView searchText;//SearchView是Android原生的搜索框控件,它提供了一个用户界面,用于用户搜索查询
/**SearchView属性
属性名称 相关方法 描述
android:iconifiedByDefault setIconifiedByDefault(boolean) 设置搜索图标是否显示在搜索框内
android:imeOptions setImeOptions(int) 设置输入法搜索选项字段,默认是搜索,可以是:下一页、发送、完成等
android:inputType setInputType(int) 设置输入类型
android:maxWidth setMaxWidth(int) 设置最大宽度
android:queryHint setQueryHint(CharSequence) 设置查询提示字符串*/
privateSearchView search;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//创建导航栏并给导航栏设置返回上一级界面按钮
ActionBar bar=getActionBar();if (bar!=null){
//设置显示返回主界面按钮
bar.setHomeButtonEnabled(true);
//设置显示返回上一级按钮
bar.setDisplayHomeAsUpEnabled(true);
}
searchText=(TextView)findViewById(R.id.searchText);
}
@Overridepublic booleanonCreateOptionsMenu(Menu menu){
//当创建菜单时调用被类中最下面定义好的setIconEnable()方法传入参数,设置显示图像
setIconEnable(menu,true);//设置显示图像
//目录中创建了一个专门放menu资源的鹅menu包,包中创建了一个menu_option.xml文件,这里将那个文件投影进来 //将菜单资源文件投影进来
getMenuInflater().inflate(R.menu.menu_option,menu);//先取出资源文件中的搜索项search
MenuItem item =menu.findItem(R.id.search);//从Item中取出绑定的SearchView搜索框控件
search =(SearchView)item.getActionView();//给搜索控件绑定获取焦点事件
search.setOnQueryTextFocusChangeListener(newView.OnFocusChangeListener(){
@Overridepublic void onFocusChange(View v,booleanhasFocus){if(hasFocus){
//如果获得焦点则将searchText的设置为可见
searchText.setVisibility(TextView.VISIBLE);
}else{
//否则设置为隐藏
searchText.setVisibility(TextView.GONE);
}
}
});
//给搜索控件绑定查询文本内容事件
search.setOnQueryTextListener(newSearchView.OnQueryTextListener(){
@Overridepublic booleanonQueryTextSubmit(String query){return false;
}
//如果控件中文本内容发生改变则,在searchText中将“搜索:内容”显示出来
@Overridepublic booleanonQueryTextChange(String newText){
searchText.setText("搜索:"+newText);return false;
}
});return super.onCreateOptionsMenu(menu);
}
//当用户点击menu item,将会触发onOptionItemSelected()回调函数
//控制返回上一级菜单的方法
@Overridepublic booleanonOptionsItemSelected(MenuItem item){
//通过itemId判断具体是那个菜单项被用户点击
//当用户点击了左上角的返回按钮,与系统中的返回键的id匹配,则finishif (item.getItemId() ==android.R.id.home)this.finish();return super.onOptionsItemSelected(item);
}//通过反射获取menu,然后修改属性设置图像可以显示
private void setIconEnable(Menu menu,booleanenable){try{
Class> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
//通过setAccessible()方法设置为true,才能进一步设置菜单的图标显示问题
//修改访问修饰符,让方法可以被访问
Method m= clazz.getDeclaredMethod("setOptionalIconsVisible",boolean.class);
m.setAccessible(true);//下面传入参数,要想给方法传参必须得能够访问这个方法,所以上面必须修改访问修饰符,在上面创建菜单时调用了setIconEnable()方法,传了true
m.invoke(menu,enable);
}catch(Exception e){
e.printStackTrace();
}
}
}