В Android, как я могу программно установить AutoCompleteTextView в начале действия? (Ява) - PullRequest
0 голосов
/ 28 октября 2019

Я использую AutoCompleteTextView в качестве ExposedDropdownMenu в соответствии с Руководством по материалам Google. Во-первых, я хотел бы заявить, что я могу успешно установить текстовое значение AutoCompleteTextView программным путем, ожидая ~ 300 мс после вызова функции onCreate (), с правильными значениями внутри выпадающего меню. Однако, когда я заранее устанавливаю текст AutoCompleteTextView программно (например, внутри onCreate () без задержки), возникает странная проблема, когда выпадающее меню AutoCompleteTextView по какой-то причине пусто (и нет, это не из-за фильтрации).

ПРИМЕЧАНИЕ. Я изменил этот код из своего исходного исходного кода, чтобы его было легче понять и сделать менее сложным. Он не был протестирован и может иметь ошибки.

private String[] VALUES = new String[]{"val1", "val2", "val3", "val4"};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ArrayAdapter<String> adapter = new ArrayAdapter<>(mainActivity.getApplicationContext(), R.layout.dropdown_menu_popup_item, VALUES);

    AutoCompleteTextView autoCompleteTextView = findViewById(R.id.auto_complete_text_view);
    autoCompleteTextView.setAdapter(adapter);
    autoCompleteTextView.setOnItemClickListener((parent, view, position, id) -> {
        //Do something here when item is selected
    });

    //Here I want to set the text value to something in onCreate()
    //without having to wait a random amount of time
    autoCompleteTextView.setText("val3", false);
}

В результате раскрывающееся меню AutoCompleteTextView содержит только «val3» и никаких других значений из адаптера. На первый взгляд похоже, что это фильтрация, но это не так (обратите внимание, что для логического фильтра установлено значение false). Список содержит только «val3». Однако если я подожду ~ 300 мс или около того, то все будет работать как положено.

private String[] VALUES = new String[]{"val1", "val2", "val3", "val4"};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ArrayAdapter<String> adapter = new ArrayAdapter<>(mainActivity.getApplicationContext(), R.layout.dropdown_menu_popup_item, VALUES);

    AutoCompleteTextView autoCompleteTextView = findViewById(R.id.auto_complete_text_view);
    autoCompleteTextView.setAdapter(adapter);
    autoCompleteTextView.setOnItemClickListener((parent, view, position, id) -> {
        //Do something here when item is selected
    });

    new AsyncTaskThatWaits300ms().execute();
}

private static class WaitForAutoCompleteTextViews extends AsyncTask<String, Void, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

    @Override
    protected void onPreExecute() {
        if (dialog != null) {
            this.dialog.setMessage("Waiting 300ms...");
            this.dialog.show();
        }
    }

    @Override
    protected Boolean doInBackground(final String... args) {
        try {
            //Do something
            Thread.sleep(300);
            return true;
        } catch (Exception e) {
            Log.e(TAG, "doInBackground error: ", e);
            return false;
        }
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog != null) {
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
        //If I set it here, the text will display with the correct values in the dropdown list, instead of only "val3".
        autoCompleteTextView.setText("val3", false);
    }
}

1 Ответ

0 голосов
/ 28 октября 2019

Вы хотите установить текст определенного элемента в автозаполнении просмотра текста, нажав на этот элемент? Если это так, то autoCompleteTextView.setText () будет внутренней частью метода onitemclicklistener ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...