我创建了两个不同类的微调器。我想根据其他类的其他微调器的选择值设置一个微调器的内容。任何人都可以提前帮助我。谢谢。
答案 0 :(得分:1)
有一个解决方案,您可能觉得实施起来很漫长,但我认为这对您来说非常有用!
假设您的ActivityOne.class中有spinner_one,ActivityTwo.class中有spinner_two。并且您希望根据spinner_1中选择的内容填充spinner_2。
然后,
spinner_1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// save your selected item into a SharedPreference Variable
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
现在,对于spinner_2:
String spinner1_value=get value from SharedPreference;
if(spinner1_value.equals("something_1"))
{
//populate spinner_2 accordingly
}
else if(spinner1_value.equals("something_2"))
{
//populate spinner_2 accordingly
}
else
{
//populate spinner_2 accordingly
}
并且不要忘记将此代码填充到ActivityTwo.class的onResume()中的spinner_2中,以便它反映用户在spinner_1值中所做的更改。
这将允许您在用户更改时根据spinner_1值更改spinner_2内容。
答案 1 :(得分:1)
简短的回答是,您可以以编程方式执行此操作 - 通过将新的ArrayAdapter分配给Spinner,或者从现有的ArrayAdapter中删除/添加项目。
更长的答案是你必须非常小心依赖OnItemSelectedListener.onItemSelected(),因为如果旧选择和新选择恰好位于相同位置,它将不会被调用,并且Spinner.getSelectedItemPosition( ),因为如果您正在移动项目,它实际上可以返回大于ArrayAdapter中项目数的位置。
我有一个由三个级联旋转器组成的系统,它可以驱动其他按钮和文本的内容。我能够获得95%的解决方案,直到我认识到上述内容并改变了我对权威和不具备权力的看法 - 通过使Spinner服从于确定内容的逻辑,而不是相反。因此,不是调用setSelection()并依赖于onItemSelected()回调,而是在处理程序之外执行所有级联逻辑,然后再调用setSelection()并返回链。
改编自我的工作代码:
class Spinster extends Activity {
...
private void setSpinnerOne( int pos ) {
// 1. Do our own chores, etc
doSomeStuff();
mSomeText.setText( "Blah!" );
mSomeButton.setEnabled( some_condition );
// 2. Populate dependent Spinner based on pos
populateSpinnerTwoAdapter( pos );
// 3. Cascade by calling SpinnerTwo logic (not the Spinner itself)
lSpinnerTwoPos = someNiceFunction();
setSpinnerTwo( lSpinnerTwoPos );
// 4. Now set SpinnerOne
mSpinnerTwo.setSelection( pos );
}
private void setSpinnerTwo( int pos ) {
// Follows the same pattern as setSpinnerOne(), but cascades to SpinnerThree
}
private void setSpinnerThree( int pos ) {
// Follows the same pattern as setSpinnerOne(), but need not cascade
}
...
private OnItemSelectedListener item_select = new OnItemSelectedListener() {
public void onItemSelected( AdapterView parent, View v, int position, long id )
{
...
int lId = parent.getId();
if ( lId == R.id.spinner_one ) {
setSpinnerOne( position );
} else if ( lId == R.id.spinner_two ) {
setSpinnerTwo( position );
} else if ( lId == R.id.spinner_three ) {
setSpinnerThree( position );
}
}
}
}
我在这里省略了一个小细节,即在setSpinner *()方法中设置和清除一个保护变量,这样当onSelectedItemListener()调用它们时,它们就不会再费心去做所有的工作了。我认为基本逻辑更容易显示出来。 (并且他们不会严格需要在那里 - onItemSelected()将不会被第二次调用。)
如果这被认为是抽象的话,我可以发布一个真实的,有效的例子。