Как сохранить OnItemSelected от запуска только что созданного Spinner? - PullRequest
396 голосов
/ 01 апреля 2010

Я придумал несколько менее элегантных способов решить эту проблему, но я знаю, что, должно быть, что-то упустил.

Мой onItemSelected немедленно отключается без какого-либо взаимодействия с пользователем, и это нежелательное поведение. Я хочу, чтобы пользовательский интерфейс ждал, пока пользователь что-то выберет, прежде чем он что-то сделает.

Я даже пытался настроить слушателя в onResume(), надеясь, что это поможет, но это не так.

Как я могу остановить это до того, как пользователь сможет прикоснуться к элементу управления?

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.
    }
}
}

Ответы [ 33 ]

0 голосов
/ 10 апреля 2015

если вам нужно воссоздать активность на лету, например: смена тем, простой флаг / счетчик не сработает

используйте функцию onUserInteraction () для определения активности пользователя,

ссылка: https://stackoverflow.com/a/25070696/4772917

0 голосов
/ 08 июля 2015

Это не очень элегантное решение, но я считаю, что оно работает надежно. Просто установите слушателей на задержанный поток изнутри onResume. После этого вы можете свободно выполнять любую инициализацию, а пользовательский интерфейс затем вносит изменения в макет, а затем настраивает слушателей.

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();
0 голосов
/ 01 апреля 2010

Я бы попробовал позвонить

spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

после вызова setAdapter (). Также попробуйте позвонить до адаптера.

У вас всегда есть решение использовать подклассы, где вы можете обернуть логический флаг в переопределенный метод setAdapter, чтобы пропустить событие.

...