使用Fragment +searchview过程中遇到的问题

还是学习安卓中。遇到了几个小问题,在这记录一下解决办法。


1、使用FragmentTabHost + Fragment实现底部菜单的切换。最终实现如下:

使用Fragment +searchview过程中遇到的问题_第1张图片

其中,每个列表页,顶部有个搜索按钮,点击搜索按钮后出现搜索框,可以从所有表项中模糊搜索出特定项。最终实现如下:



问题1:onCreateViwe() 什么时候调用?

fragment的生命周期见:http://blog.csdn.net/forever_crying/article/details/8238863/

切换到别的,再切换回本身的Fragment:依次调用:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume


所以,只要界面上重新绘制(而不是退到栈中)当前页,就会调用 onCreateViwe()。所以这个函数中不能简单加载数据,应该做一些判断,如第一次登陆?刷新数据?等。或者把获取数据写在其他阶段。

这个原因,也是造成问题2的原因。


问题2:onCreateViwe() 根据布局文件绘制界面,无法保持组件的可见性属性变化。

在fragment之间切换后,各个fragment可以保持原有的状态(控件状态,输入值等)。但是,由于我的搜索框布局默认是visibility:gone,等单击搜索按钮后才通过java代码设置为visible。在切换后回到原界面,恢复时onCreateViwe()再次绘制界面是根据布局文件绘制,因此会把搜索框设置为visibility:gone。这造成的现象是:我在TAB1正在搜索内容,此时未关闭搜索框而直接点击切换到TAB2,再次切换为TAB1时,搜索框不见了~(搜索框内的值还在,但是visibility:gone,因为界面重新绘制了)。

解决:

根据fragment的生命周期,我在onPause中加入了对搜索框可见性的判断。在界面暂停(离开、切换等)时,记录搜索框的可见性,并在onCreateViwe()中加入判断,若界面(上次)暂停时搜索框可见,则直接设置搜索框为visibility:visible.


问题3:还是搜索框的问题。SearchView有个setOnQueryTextListener方法设置对搜索文本变化的事件,需要重写两个函数,onQueryTextSubmit和onQueryTextChange。其中,onQueryTextChange监听文本变化事件。奇怪的是,经过调试发现:切换fragment会触发一次onQueryTextChange事件,即使搜索文本没有变化!(第一次onCreateView不触发,之后都触发)


解决:没有实际解决。由于监听搜索框变化是用来筛选数据,这个问题没有太大影响,只是凭白多了一次对空文本的筛选很不爽。找了很久还是没有找到原因,希望有知道的人指点!


FragmentTabHost + Fragment 都说被用来代替曾经的TabHost,但是总感觉UI代码量有点大,而且效果不尽人意。使用FragmentTabHost 来切换页面,实现代码没有涉及Fragment 的.hide() + .show() 与.replace() .但从实现结果中可以看到切换页面保留了原来的状态,所以应该不是用replace的方式来切换页面。


哎,现在觉得.net winform真的是很简单。拉一个tabControl解决所有问题,需要的只是处理业务代码。这两天为了安卓界面真实废了不少功夫入门。。。

你可能感兴趣的:(android,Fragment,searchView)