代码之家  ›  专栏  ›  技术社区  ›  Oliver

Android-Spinner:如何在一个ontemselectedlistener中区分用户的操作和计算机的操作

  •  4
  • Oliver  · 技术社区  · 14 年前

    我在管理纺纱机时遇到了麻烦,我可以请你帮忙吗?

    我有一个带适配器的旋转器。 启动活动时,我使用值列表初始化微调器。 然后我强制选定的值是我管理的对象中使用的值。

    屏幕初始化后: 当用户在微调器中选择一个值时,我可以根据所选的值继续(或不继续)到另一个活动,以便让用户选择一个互补的必要值。 如果用户“取消”第二个活动,我希望将微调器回滚到其先前选定的值,并取消在此期间所做的某些操作。 如果用户走到第二个活动的末尾,一切都很好,我只想用在第二个活动中选择的数据刷新微调器显示(为此,我在适配器中重载getView方法)。

    总之,我可以轻松地完成所有这些操作,但是,当我在活动开始时强制微调器中的选定值,或者当通过“取消”从第二个活动返回时,将捕获更改值事件并触发第二个活动(用户根本没有单击任何内容)。

    仅当微调器中所选值的更改是由于用户的手动操作所致时,如何允许启动第二个活动,并在“代码”中更改微调器的值时阻止启动相同的第二个活动?

    我尝试了很多解决方案,比如在适配器中设置一个布尔值,告诉下一个事件是否由于“in-the-code”操作而引发。 或者在适配器中放入一个布尔值,告诉适配器是否已经初始化了自身,然后在forst change catched事件中强制该布尔值为true。 但没有什么能真正起作用。

    谢谢你的帮助。

    奥利弗

    1 回复  |  直到 14 年前
        1
  •  4
  •   blindstuff    14 年前

    我一直用布尔标志来解决这个问题,它一点也不漂亮,但是如果你仔细考虑的话,它会起作用的。

    这个想法或多或少,创造了一个全球性的 可用的 布尔值和init ,在onSelectedItemListener()中,使用该布尔值选择是否触发操作,需要记住的重要一点是在计算机第一次自动选择后将其设置为true,并在onResume()方法中将其重置为false。

    这不是完美的,但应该有效。

    编辑:

    bool spinnerUsable1;
    bool spinnerUsable2;
    int positionSpinner;
    
    public void onCreate(Bundle savedInstanceState){
       spinnerUsable1 = false;
       spinnerUsable2 = true;
       if(savedInstanceState != null){
          positionSpinner = savedInstanceState.getInt("posSpinner");
          if(positionSpinner != 0) spinnerUsable2 = false;
       }
    
       //Declare your spinner, set the on item selected lister
       spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    boolean spinnerUsable = (spinnerUsable1 && spinnerUsable2);
                    if (!spinnerUsable1) {
                        spinnerUsable1 = true;
                    } else if (!spinnerUsable2) {
                        spinnerUsable2 = true;
                    }
                    if (spinnerUsable) {
                        //Action;
                    }
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // Nothing
                }
            });
    }
    

    像这样的事情应该行得通。