在 Android 中动态禁用微调器项目

Posted

技术标签:

【中文标题】在 Android 中动态禁用微调器项目【英文标题】:Disabling dynamically a spinner item in Android 【发布时间】:2020-04-06 17:03:03 【问题描述】:

对于我们的项目,我需要实现以下内容:当在另一个微调器中选择相同的项目时禁用微调器项目(反之亦然)。关于如何处理它的任何想法,或者是否已经存在这样的实现(可能在适配器或 Spinner 类中)?

【问题讨论】:

这可能会有所帮助:***.com/questions/29474829/… @CésarFerreira 谢谢!但是,这个没有显示对一组项目中单个项目的操作,而只是为第二个微调器插入另一个列表(动态)。 覆盖 onOptionsItemSelected 并通过对特定微调器应用检查返回 true。 【参考方案1】:

我了解两个微调器具有相同的项目列表,因此您可以设置第一个并获取位置并在第二个微调器中自动禁用该位置。

public class MainActivity extends AppCompatActivity 
int selectedItemSpinner1;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    // Items in the two Spinners
    String[] languages = new String[]
            "English",
            "French",
            "German",
            "Spanish",
            "Italien"
    ;
    List<String> languagesList = new ArrayList<>(Arrays.asList(languages));


    // Set the spinner 1 and get the selected value position
    Spinner spinner1 =  findViewById(R.id.spinner1);
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this,R.layout.support_simple_spinner_dropdown_item,languagesList);
    spinner1.setAdapter(adapter);

    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
            selectedItemSpinner1 = position;
        

        @Override
        public void onNothingSelected(AdapterView<?> parent) 
        
    );


    // Set the spinner 2 and disable the position
    Spinner spinner2 =  findViewById(R.id.spinner2);
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item,languagesList)
        @Override
        public boolean isEnabled(int position)
            if(position == selectedItemSpinner1)
             return false;
            
            else
            
                return true;
            
        

        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) 
            View view = super.getDropDownView(position, convertView, parent);
            TextView tv = (TextView) view;

            if(position==selectedItemSpinner1) 
                // Set the disable item text color
                tv.setTextColor(Color.GRAY);
            
            else 
                tv.setTextColor(Color.BLACK);
            
            return view;
        
    ;
    spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
    spinner2.setAdapter(spinnerArrayAdapter);

【讨论】:

谢谢!这有效,但这不是动态设置的。你会在什么时候检查某个微调器是否应该禁用某些项目 - 知道某个项目已被禁用,如果它在另一个微调器上被选中(反之亦然)?

以上是关于在 Android 中动态禁用微调器项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Spinner 中隐藏一项

在Android中动态改变微调器的宽度

如何将项目添加到 Android 中的微调器?

在Android中动态单击按钮添加微调器

在 AsyncTask 中动态地将项目添加到微调器

在 Android 中使用 Spinner Dependable 创建动态视图