-1

我有一个微调器,当一个项目被选中时,我想重新创建活动。但是当重新创建活动时,它会不断重新创建,因为触发了新的 itemSelectedListener。我已经修复了这个错误,但我对为什么会发生这种情况感兴趣。提前感谢您提供的任何见解。

    sp_lang.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               recreate();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
4

1 回答 1

2

您可以通过 OnItemSelectedListener 中的标志避免第一个事件。

sp_lang.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        Boolean firstEventConsumed = false;

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               if (firstEventConsumed) {
                   recreate();
               } else {
                   firstEventConsumed = true;
               }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

编辑

我找到了解决方案,但这只是一种解决方法。这不是一个确定的解决方案。

当您重新创建活动时,它有一个奇怪的行为。第一次创建活动时,它不会调用两次onItemSelected,但重新创建时会调用两次。

我在下面所做的是控制用户何时选择项目(处理触摸事件)以及何时由活动完成。

public class MainActivity extends AppCompatActivity {

    private Boolean isUserAction = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        // get the spinner
        // create the adapter
        spinner.setAdapter(spinnerAdapter);
        spinner.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                isUserAction = true;
                return false;
            }
        });
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (isUserAction) {
                    recreate();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // do nothing
            }
        });
    }
}
于 2019-06-26T15:04:36.843 回答