OnItemSelectedListener Spinner 重新创建循环 - Android
OnItemSelectedListener Spinner Recreate loop - Android
我有一个微调器,当一个项目被选中时我想重新创建 activity。但是当 activity 被重新创建时,它会不断地重新创建,因为新的 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) {
}
});
您可以在 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) {
}
});
编辑
我找到了解决方案,但这只是一种解决方法。这不是最终的解决方案。
当您重新创建 activity 时,它有一个奇怪的行为。第一次创建 activity 时,它不会调用两次 onItemSelected
,但在重新创建时会调用两次。
我在下面所做的是控制项目何时被用户选择(处理触摸事件)以及何时由 activity.
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
}
});
}
}
我有一个微调器,当一个项目被选中时我想重新创建 activity。但是当 activity 被重新创建时,它会不断地重新创建,因为新的 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) {
}
});
您可以在 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) {
}
});
编辑
我找到了解决方案,但这只是一种解决方法。这不是最终的解决方案。
当您重新创建 activity 时,它有一个奇怪的行为。第一次创建 activity 时,它不会调用两次 onItemSelected
,但在重新创建时会调用两次。
我在下面所做的是控制项目何时被用户选择(处理触摸事件)以及何时由 activity.
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
}
});
}
}