防止下拉菜单显示为“Spinner”类型

11
我正在使用一个动态填充适配器的下拉列表。
  • 当有多个选项时,下拉列表的行为是标准的。单击后,下拉列表会显示,用户可以选择一个选项。
  • 当只有一个选项时,我想防止下拉列表出现,并捕获单击事件执行某个操作。

我找不到阻止默认行为(即在单击时为仅一个选项显示下拉列表)的解决方案。你对如何做到这一点有什么想法吗? 谢谢

3个回答

11

嗯... 如果 spinner 中只有一个项目,尝试使用 setClickable(false)setEnabled(false)

试试这个:

public class SpinnerActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Spinner spinner = (Spinner) findViewById(R.id.spinner1);
        List<String> list = new ArrayList<String>();
        list.add("list 1");
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);

        if (list.size() < 2) {
            spinner.setClickable(false);
            spinner.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        Toast.makeText(SpinnerActivity.this, "Catch it!", Toast.LENGTH_SHORT).show();
                    }
                    return true;
                }
            });
        }


    }
}

这绝对解决了问题的第一部分(防止下拉菜单显示),但由于我无法在Spinner上设置点击监听器,而且Spinner被禁用或不可点击,因此我无法捕获点击事件:( - Breiz
这个存在问题,因为一些版本或供应商会在 ACTION_DOWN 上显示项目。我认为这在某些设备上可以工作,但在其他设备上则不行。 - Micah Hainline

8
为了防止下拉列表出现,我在onTouch(...)中只返回true,像这样:
    spinner.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            return true;
        }
    });

0

在 Kotlin 中,我是这样做的

  <string-array name="coins_array">
    <item>USD</item>
    <item>USDT</item>       
  </string-array>

 
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.main_activity.*


class MainActivity: AppCompatActivity(), AdapterView.OnItemSelectedListener{
    private var touchEvent = false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        ArrayAdapter.createFromResource(this, R.array.coins_array, android.R.layout.simple_spinner_item
        ).also { adapter ->
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            coin_choice.adapter = adapter
        }
        coin_choice.onItemSelectedListener = this

    }

    override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
        if(touchEvent){
            val coin: String = parent.getItemAtPosition(position).toString()
            Toast.makeText(this, coin, Toast.LENGTH_SHORT).show()
        }
        touchEvent = true
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接