根据另一个类的其他微调器的选定值动态设置一个微调器的内容

时间:2011-05-07 05:41:38

标签: android spinner

我创建了两个不同类的微调器。我想根据其他类的其他微调器的选择值设置一个微调器的内容。任何人都可以提前帮助我。谢谢。

2 个答案:

答案 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()将不会被第二次调用。)

如果这被认为是抽象的话,我可以发布一个真实的,有效的例子。