原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0825/615.html
Spinner初始化与监听 <wbr> <wbr>onItemSelected实行两次
企业培训界面上有Spinner用于选定波形的类型,Spinner的左边有一方块,用于显露波形的色彩。界面上统共有4个通道可选。该4个通道的风格同样,故编写了一个wave_channel_choose.xml文件,如下所示:
Spinner初始化与监听 <wbr> <wbr>onItemSelected实行两次
界面上4个通道选定中的spinner选定后,滑动界面,直到该界面被烧毁,从新进入该界面,全部的spinner上的选项均造成与末了一个spinner的选项同样,无论界面上有几许个wave_channel_choose,界面烧毁后从新进入界面,spinner的选项总是造成与末了一个同样。
为查缘故,为每个spinner增长了监听事务,发现每一个spinner均会两次进入onItemSelected()函数,而且两次进入该函数的时候,选中的选项值是同样的。官方文档上说选定选项与本来不同样的时候,才会触发监听事务,挪用onItemSelected()。实际试验的后果与官方文档形貌地不一致。这点我无法解释,尚不知为什么。
在Android体系中,页面烧毁的时候,普通会挪用onSaveInstanceState()函数,将目前页面上控件的状况留存下来,以用于下次构建页面的时候,恢复控件的状况。好比目前EditText的表现内容、Spinner确目前选项等。不过这个感化,应该指的是对目前页面的干脆控件有用,即在XML文件中干脆写入的控件,而不是通过include属性包括其余的xml文件中控件的子控件。
干脆在常州软件技术培训xml文件放置4个Spinner控件,滑动页面。滑动到前第3个页面,目前页面烧毁,确定再进入时,会从新构建。发现Spinner确实会留存页面烧毁前的状况。监听这4个Spinner,每次重建页面后,会挪用两次onItemSelected(),而且两次挪用时,选定的选项地位是同样的。
网上搜刮环节字“onItemSelected() 两次进入”,找到打听决计划:增长函数“spinner.setSelection(0,false);”。实际应用发现挪用setSelection(int ,boolean)函数,第2个参数是false照旧true都是可以的。不过必然要挪用有两个参数的,挪用setSelection(int)仍然照旧会两次进入onItemSelected()。而且函数的挪用是要在设置监听器之前,不然也是无效的。
spinner.setSelection(0,false);
spinner.setOnItemSelectedListener(this);
用include导入的xml文件相配于自定义控件,体系无法正确留存控件的状况。是以重写onSaveInstanceState()函数,增长4个Spinner的状况,onCreateView()中读取savedInstanceState中的状况,赋值给spinner。发现再次进入页面,自定义xml中的spinner的选中项仍然是全部控件都被末了一个影响,表现的选项均与退出页眼前的末了一个选项同样。
在onResume()函数中,分别读取每个spinner的值,打印出来,发现确实是退出页眼前的值,但后来又挪用了函数onItemSelected(),选中的选项均是末了一个spinner的值。以是导致页面上表现的4个spinner选定均与末了一个同样。
onResume()是常州平台运营页面变为有用前挪用的函数,是以在该函数中增长语句,将每个spinner目前的item值,读出来后,从新设置给各个spinner。
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
Spinner spinner = null;
int item = 0;
for (int i=0; i
item = i;
spinner = (Spinner)getView().findViewWithTag(i);
item = spinner.getSelectedItemPosition();
//该语句包管spinner上表现的选项不受末了一个spinner的影响。
//要是为spinner在onCreateView中设置初始值在监听函数之前,
//如下常州微信公众平台语句还能防止两次进入onItemSelected()函数
spinner.setSelection(item);
}
} }
上篇:上一篇:Android底部导航BottomNavigationBar
下篇:下一篇:Android Fragment增加 FragmentTransaction