当前位置: 首页 > 知识库问答 >
问题:

在Android中,如何以编程方式在活动开始时设置AutoCompleteTextView?(Java)

都昊乾
2023-03-14

我正在使用自动完成文本视图作为暴露的拖放菜单根据谷歌材料指南。首先,我想声明,我能够在调用 onCreate() 函数后等待 ~300 毫秒,并在下拉建议菜单中使用适当的值,以编程方式成功设置自动完成文本视图的文本值。但是,当我事先以编程方式设置自动完成文本视图的文本时(例如,在没有延迟的onCreate()内部),出现了一个奇怪的问题,即自动完成文本视图的下拉菜单由于某种原因而为空(不,这不是因为过滤)。

注意:我已经修改了我的原始源代码中的代码,使其更容易理解,更简单。它尚未经过测试,可能会有错误。

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 ”,没有来自适配器的其他值。乍一看,它好像在过滤,但实际上不是(注意,filter boolean设置为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个答案

高迪
2023-03-14

是否要通过单击特定项目在自动完成文本视图上设置该项目的文本?如果是自动完成文本视图.setText() 将位于 onitemclicklistener() 方法的内部。

 类似资料:
  • 我在Android中以编程方式设置APN。当我运行代码时,我得到。如果我在清单中提到这个权限,我得到的错误就像这些权限只有SYSTEM APPS。你能帮我解决这个问题吗?参考链接

  • 在这个,这个和这个线程,我试图找到一个答案,如何设置一个单一视图的边距。不过,我在想是不是没有更简单的方法。我将解释为什么我不想使用这种方法: 我有一个扩展按钮的自定义按钮。如果背景设置为默认背景以外的其他内容(通过调用或),我希望边距为0。如果我把这个叫做: 我想让边距重置为-3dp(我已经在这里阅读了如何从像素转换为dp,所以一旦我知道如何设置px中的边距,我可以自己管理转换)。但是,由于这是

  • 如何在Android中以编程方式设置谷歌字体 应用程序崩溃原因:android。所容纳之物res.Resources$NotFoundException:无法检索字体资源ID#0x7f090002。

  • 我正在使用AutoLayout开发iPad应用程序,如果用户启用某个模式(“平视”模式),我希望只支持纵向(或纵向倒置)方向,而且,如果设备处于横向,我希望自动切换到纵向模式。 在顶视图控制器中,我有以下内容: 根据我在这里其他地方看到的答案,答案似乎是我应该使用“application SetStatusBaroOrientation”。因此,在用户选择“抬头”模式的方法中,我包括: 然而,这似

  • 问题内容: 我正在动态创建按钮。我首先使用XML设置了样式,然后尝试使用下面的XML使其具有程序性。 这是我到目前为止所拥有的。除了可绘制对象,我可以做所有事情。 问题答案: 你可以使用该方法执行此操作。请参阅此处的示例。我在不使用的情况下使用了它,并且效果很好。你可以尝试任何一种方式。 更新:如果链接断开,请在此处复制代码 要么 要么

  • 问题内容: 设置背景: 是最好的方法吗? 问题答案: ;是正确的。 实现它的另一种方法是使用以下方法: 但我认为出现此问题是因为你尝试加载大图像。 这是一个很好的教程,介绍如何加载大位图。 更新: API级别22中不推荐使用getDrawable(int) 现在API级别22中不推荐使用。你应该改用支持库中的以下代码: 如果你引用的源代码,它将为你提供以下信息: 有关ContextCompat的更