存起来方便以后用到:
最近用到Action Bar,其中最纠结的就是SearchView了,查了很多,都没有写到这些细小的地方. 我就在巨人的肩膀上添加一些小细节吧. 遇到的问题: 1.ActionBar中不显示 2.默认图标修改 3.控件的监控 其中最耗时间的就是样式的问题了,后面会详细分析一下. 一.ActionBar中不显示 有两种情况: 1.menu的中xml文件中的设置问题: <item android:id="@+id/action_search" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/ic_action_icon_search2" android:showAsAction="always" android:title="@string/search"/> 注意 这里需要注意android:showAsAction属性,它有五个属性值: -------------- ifRoom, collapseActionView, withText, never, always, -------------- 这里如果你的Item不显示,不妨设置为always 然后在Activity的onPrepareOptionsMenu()方法中进行显示or隐藏的判断. 当然屏幕不够了还是会受收到overflow(三个小点)中的. 2.你在styles.xml文件中使用了自定义的ActionBar的style. 这里就需要你去判断你用了哪些属性了,这里就不深究了. 例如: <resources> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#f4842d</item> </style> </resources> 二.SearchView的获取和设置 这是重点,网上有很多资料,这里我就总结一些我看过后还是遇到的问题. 1.获取实例与初始化绑定事件 在Activity的onCreateOptionsMenu方法中: @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); //获取Menu的Inflater menuInflater.inflate(R.menu.main, menu); //inflate你的Item布局 MenuItem action_search = menu.findItem(R.id.action_search); //获取MenuItem的实例,注意,这里获取的不是SearchView的实例. action_search.setVisible(false); //设置Item是否可见,这里与View的设置不太一样,接受的是boolean值,只有两种状态 searchViewInit(menu);//自定义的一个初始化SearchView的方法 return true; } /** * SearchView的初始化 */ private void searchViewInit(Menu menu) { //这里需要用到SearchView的布局文件[1],文章结尾有github的链接 //用MenuItem的`getActionView()`方法获取`android:actionViewClass`说对应的实例,这里是`android.widget.SearchView` SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSubmitButtonEnabled(true);//是否显示确认搜索按钮 searchView.setIconifiedByDefault(false);//设置展开后图标的样式,这里只有两种,一种图标在搜索框外,一种在搜索框内 searchView.setIconified(false);//设置 searchView.clearFocus();//清除焦点 /* 这里是重点,SearchView并没有提供样式的修改方法,所以只能 1.用获取到的实例调用getContext()方法,返回当前view的上下文 2.调用getResources()方法,获取该view的资源实例(Return a Resources instance) 3.调用getIdentifier()方法,获取相同名字的ID,(Return a resource identifier for the given resource name) 4.通过findViewById()获取该ID的实例,然后就可以做相应的操作了 */ int search_mag_icon_id = searchView.getContext().getResources().getIdentifier("android:id/search_mag_icon", null, null); ImageView search_mag_icon = (ImageView)searchView.findViewById(search_mag_icon_id);//获取搜索图标 search_mag_icon.setImageResource(R.drawable.ic_action_icon_search2);//图标都是用src的 //设置提示文字的颜色,这里走了点奇招,用Html类方法 searchView.setQueryHint(Html.fromHtml("<font color = #999999>" + getResources().getString(R.string.search_input) + "</font>")); //设置搜索事件的监控 searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { //当点击搜索按钮,输入法搜索按钮,会触发这个方法.在这里做相应的搜索事件,query为用户输入的值 //当输入框为空或者""时,此方法没有被调用 return true; } @Override public boolean onQueryTextChange(String newText) { //当输入的文字发生变化的时候,会触发这个方法.在这里做匹配提示的操作等 return true; } }); //如果希望SearchView一直处理展开状态,可以实现它的OnCloseListener方法 //返回true,截取关闭事件,不让搜索框收起来 searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { return true; } }); } 三.SearchView样式的修改 这是我最头疼的地方,我想修改item中的这个图标 在XML中设置icon并不能修改SearchView的搜索图标: <item android:id="@+id/action_search" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/ic_action_icon_search2" android:showAsAction="always" android:title="@string/search"/> 游客,如果您要查看本帖隐藏内容请回复 |
Leif 发表于 2014-11-6 11:49 有没有searchview的源码呢 SearchView的源码可以直接查看的,只要你的SDK下好了,只是布局难找而已 |
Leif 发表于 2014-11-6 10:04 样式部分怎么只有一半呢 这里只是提供一个思路给大家,不必像我之前一样纠结为什么图标不变 |
遥远的地方 发表于 2014-11-6 17:48 看看怎么修改SearchView的样式。 只是提供了一点思路,真正的样式还需要自己去尝试 |
看看自定义的部分 |