Fav*_*las 8 android android-spinner
我有三个微调器的布局.它们在下拉列表中显示的选项不同.
在我的onCreateView我不得不安装微调的方法.在这个方法里面我有这样的东西:
mySpinner = (Spinner) view.findViewById(R.id.my_spinner);
ArrayAdapter<String> mySpinner =
new ArrayAdapter<String>(getActivity(), R.layout.background,
new ArrayList<String>(Arrays.asList(getResources().getStringArray(R.array.spinner_one_data))));
mySpinner.setDropDownViewResource(R.layout.spinner_text);
mySpinner.setAdapter(mySpinner);
mySpinner.setOnItemSelectedListener(this);
Run Code Online (Sandbox Code Playgroud)
正如我所说,我的另外两个旋转器几乎相同,但有不同的选择.
我知道onItemSelected在"第一次设置"中为每个微调器调用一次,所以我有一个标志来防止这个问题.有了这个标志解决方案,我的微调器正在按预期工作.
问题是当我在每个微调器中选择一个选项然后旋转屏幕.现在,onItemSelected被称为6次而不是我期待的3次(我设置了一个标志来管理3次呼叫的这种情况).
它为什么会发生,我应该怎么处理?
小智 29
一般来说,我发现有许多不同的事件可以触发onItemSelected方法,并且很难跟踪所有这些事件.相反,我发现使用OnTouchListener仅响应用户启动的更改更简单.
为微调器创建监听器:
public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {
boolean userSelect = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
userSelect = true;
return false;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if (userSelect) {
// Your selection handling code here
userSelect = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
将侦听器作为OnItemSelectedListener和OnTouchListener添加到微调器:
SpinnerInteractionListener listener = new SpinnerInteractionListener();
mSpinnerView.setOnTouchListener(listener);
mSpinnerView.setOnItemSelectedListener(listener);
Run Code Online (Sandbox Code Playgroud)
我找到了一个适合我的解决方案。
我有3旋转器,因此在初始旋转器设置时onItemSelected称为时间。3为了避免onItemSelected在初始设置中触发方法,我创建了一个计数器,因此onItemSelected仅根据计数器值触发该方法。
我意识到,在我的情况下,如果旋转屏幕,onItemSelected则会再次触发3次数,加上每个不在位置的旋转器的时间0。
一个例子:
我有3旋转器,用户将2它们更改为除位置之外的可用选项之一0,所以他最终会遇到这样的情况:
First spinner - > Item 2 selected
Second spinner -> Item 0 selected (no changes)
Third spinner -> Item 1 selected
Run Code Online (Sandbox Code Playgroud)
现在,当我旋转屏幕时,初始旋转器设置的onItemSelected触发时间加上不在位置 的旋转器的触发时间。320
@Override
public void onSaveInstanceState(Bundle outState) {
int changedSpinners = 0;
if (spinner1.getSelectedItemPosition() != 0) {
changedSpinners += 1;
}
if (spinner2.getSelectedItemPosition() != 0) {
changedSpinners += 1;
}
if (spinner3.getSelectedItemPosition() != 0) {
changedSpinners += 1;
}
outState.putInt("changedSpinners", changedSpinners);
}
Run Code Online (Sandbox Code Playgroud)
我已保存状态,onSaveInstanceState然后onCreateView检查是否存在,savedInstanceState != null如果是,changedSpinners则从包中提取并更新我的计数器以采取相应的操作。
| 归档时间: |
|
| 查看次数: |
5594 次 |
| 最近记录: |