Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-Spinner:我如何区分用户';来自计算机的操作';s在OnItemSelectedListener中的操作_Android_Action_Listener_Spinner - Fatal编程技术网

Android-Spinner:我如何区分用户';来自计算机的操作';s在OnItemSelectedListener中的操作

Android-Spinner:我如何区分用户';来自计算机的操作';s在OnItemSelectedListener中的操作,android,action,listener,spinner,Android,Action,Listener,Spinner,我在管理纺纱机方面遇到了麻烦,我可以请你帮忙吗 我有一个带转接器的旋转器。 启动活动时,我使用值列表初始化微调器。 然后,我强制所选值成为我管理的对象中使用的值 屏幕初始化后: 当用户在微调器中选择一个值时,根据选择的值,我可以继续(或不继续)到另一个活动,以便让用户选择一个补充和必要的值。 如果用户“取消”第二个活动,我希望将微调器回滚到其先前选择的值,并取消同时执行的一些操作。 如果用户转到第二个活动的末尾,一切正常,我只想用第二个活动中选择的数据刷新微调器显示(为此,我在适配器中重载get

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

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

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

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

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

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

谢谢你的帮助


Oliver

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

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

这并不完美,但它应该可以工作

编辑:

bool喷丝头可使用1;
布尔喷丝头可供2;
微调器;
创建时的公共void(Bundle savedInstanceState){
喷丝头可供1=假;
喷丝头可纺性2=真;
如果(savedInstanceState!=null){
positionSpinner=savedInstanceState.getInt(“posSpinner”);
如果(positionSpinner!=0)spinnerUsable2=false;
}
//声明微调器,在选定列表器上设置项目
spinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
布尔spinnerUsable1=(spinnerUsable1&&spinnerUsable2);
如果(!spinnerUsable1){
喷丝头可供1=真;
}如果(!spinnerUsable2){
喷丝头可纺性2=真;
}
if(喷丝头可用){
//行动;
}
}
@凌驾
未选择公共无效(AdapterView arg0){
//没什么
}
});
}

像这样的办法应该行。

谢谢。你能更精确一点切换布尔值的位置吗?因为如果我只在计算机第一次选择布尔值时(在微调器初始化时)设置它,这似乎不起作用。这就是我在微调器适配器中使用布尔值所做的尝试。当我调用setSelection(或接近:-)强制设置微调器值时,仍然会触发微调器事件,在这种情况下,我看不到基于布尔值的(ou)解决方案如何显示它不是用户交互。
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
            }
        });
}