• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Spinner初始化监听 onItemSelected实行两次

原创内容,转载请注明原文网址: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