如何防止在新实例化的Spinner上触发onItemSelected事件?

441

我曾经想到了一些不太优雅的方法来解决这个问题,但我知道我一定错过了什么。

我的onItemSelected会在用户与控件进行任何交互之前立即触发,这是不希望发生的行为。 我希望UI在用户选择某些内容之前等待,并且在此之后才执行相应操作。

我甚至尝试在onResume()中设置监听器,希望这样做有所帮助,但没有效果。

如何阻止在用户触摸控件之前就触发 onItemSelected?

public class CMSHome extends Activity { 

private Spinner spinner;

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

    // Heres my spinner ///////////////////////////////////////////
    spinner = (Spinner) findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.pm_list, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    };

public void onResume() {
    super.onResume();
    spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}

    public class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {

     Intent i = new Intent(CMSHome.this, ListProjects.class);
     i.putExtra("bEmpID", parent.getItemAtPosition(pos).toString());
        startActivity(i);

        Toast.makeText(parent.getContext(), "The pm is " +
          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
    }

    public void onNothingSelected(AdapterView parent) {
      // Do nothing.
    }
}
}

3
你可以看一下这个解决方案,它简单实用。https://dev59.com/R2435IYBdhLWcg3w7k6b#10102356 - Günay Gültekin
1
一个简单的解决方案是将Spinner中的第一项设为空,在onItemSelected方法中检测字符串是否为空,如果不为空,则可以启动活动! - Muhammad Babar
这个模式可以正常工作:https://dev59.com/p2Yr5IYBdhLWcg3wxNC8#44715988 - saksham
33个回答

-1

这不是特别优雅的解决方案,但我发现它可靠地工作。只需在 onResume 中从延迟线程上设置监听器即可。然后您可以自由进行任何初始化操作,UI 将进行任何布局更改,然后再设置监听器。

Thread t = new Thread(){
            public void run() {
                try{                
                    Thread.sleep(1000);
                    getActivity().runOnUiThread(new Runnable() {                        
                        @Override
                        public void run() {
                            setSpinnerListeners();

                        }
                    });
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            };
        };
        t.start();

1
为什么要踩?这个是有效的。应该对 Android 支持框架进行踩票 :-D - Rafael Sanches

-1
设计一个通用的Spinner,只需输入数据并获取用户选择,优点:

1. 保持应用程序中Spinner的样式一致。
2. 在任何地方启动Spinner。
3. 易于处理链接的Spinner(使用不同的数据重新启动ReuseSpinner)。

我的演示示例:ReuseSpinner
将数据传递给ReuseSpinner:

Intent intent = new Intent(MainActivity.this, SpinnerActivity.class);
intent.putExtra(SpinnerActivity.Extra_Resource, arrayList);
startActivityForResult(intent, mRequestCode_select_country_prompt);

获取用户选择的内容:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == mRequestCode_select_country && resultCode == RESULT_OK){
            if(data != null){
                Map.Entry<String,String> entry = (Map.Entry<String,String>) data.getSerializableExtra(SpinnerActivity.Result_Data);
                if(entry != null){
                    Log.i(TAG, String.format("get result -> key:%s , value:%s", entry.getKey(), entry.getValue()));

                }
            }
        }
    }

-1

这不是一个完美的解决方案,但如果您满意于将起始字符串仅作为占位符,则可以添加占位符字符串值(“Day_of_Work_Out”)

  @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String name = (String) parent.getItemAtPosition(position);
            if (name.equals("Day_of_Work_Out")) {

            }else {

                workOutD = name;
                Intent intent = new Intent();
                workOutNam = workOutName.getText().toString();

                if (workOutNam == null) {

                    startActivity(intent);
                    Log.i("NewWorkOutActivity","Name is null");

                }else {
                    Log.i("NewWorkOutActivity","Name Not null");
                    Toast.makeText(NewWorkOutActivity.this, "Please Select a Day", Toast.LENGTH_LONG).show();
                }


            }
        }

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