【问题标题】:AutoCompleteTextView : AfterTextChange and OnItemClick working togetherAutoCompleteTextView : AfterTextChange 和 OnItemClick 一起工作
【发布时间】:2018-12-26 12:36:40
【问题描述】:

我在我的应用中添加了 AutoCompleteTextView。我在这两种方法上都进行了编码,即 afterTextChange() 如果一个人写了完整的单词并且不点击建议和 OnItemClickListener() 如果用户点击 sugesstion 但问题是这两种方法是一起工作的。如果我使用 onItemClick 单击建议,则 afterTextChange() 也可以工作,并且我的代码会运行两次。如何防止两种方法不同时运行。

OnAfterTextChange() 代码

 actvShop_name.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {

                   actvShop_name.setVisibility(View.VISIBLE);
            txtShop.setVisibility(View.GONE);
            //do nothing
            if ((actvShop_name.getText().length() != 0) && actvShop_name.getText().length() >= 3) {
                modelShopDetailsArrayList = databaseHelper.getShopDetail(actvShop_name.getText().toString(), language);

                Log.e("TAG", "onKeyDown:Add " + modelShopDetailsArrayList.size() + " " + actvShop_name.getText().toString() + language);

                if (modelShopDetailsArrayList.size() != 0) {

                    HashMap<String, String> shopDetails = session.getSelectedShopDetail();

                    Log.e("TAG", "onItemClick: " + shopDetails.get("shop_name_nl") + "  ");

                    if (shop_name != null) {

                        if (shop_name == actvShop_name.getText().toString()) {

                            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                                    Context.INPUT_METHOD_SERVICE);
                            imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                            fillShopDetails(actvShop_name.getText().toString());

                        } else {


                            AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
                            alertDialog.setMessage(R.string.delete_cart);
                            alertDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {

                                    DatabaseHelper databaseHelper = new DatabaseHelper(getActivity());
                                    databaseHelper.deleteCart();

                                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                                            Context.INPUT_METHOD_SERVICE);
                                    imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                                    fillShopDetails(actvShop_name.getText().toString());


                                }
                            });
                            alertDialog.setNegativeButton(R.string.no
                                    , new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                            dialog.cancel();
                                        }
                                    });
                            alertDialog.show();


                        }

                    } else {
                        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                                Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                        fillShopDetails(actvShop_name.getText().toString());
                    }

OnItemClickListener() 代码

 actvShop_name.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {


          //  actvShop_name.removeTextChangedListener(textWatcher);

            shop_name_entered = adapterView.getItemAtPosition(i).toString();

            actvShop_name.setVisibility(View.GONE);
            txtShop.setVisibility(View.VISIBLE);
            txtShop.setText(shop_name_entered);


            HashMap<String, String> shopDetails = session.getSelectedShopDetail();

            Log.e("TAG", "onItemClick: " + shopDetails.get("shop_name_nl") + "  " + shop_name_entered);

            if (shop_name != null) {

                if (shop_name.equals(shop_name_entered)) {

                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                            Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                    fillShopDetails(shop_name_entered);

                } else {

                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
                    alertDialog.setMessage(R.string.delete_cart);
                    alertDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            DatabaseHelper databaseHelper = new DatabaseHelper(getActivity());
                            databaseHelper.deleteCart();

                            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                                    Context.INPUT_METHOD_SERVICE);
                            imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                            fillShopDetails(shop_name_entered);


                        }
                    });
                    alertDialog.setNegativeButton(R.string.no
                            , new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            });
                    alertDialog.show();
                }

            } else {
                InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(
                        Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(actvShop_name.getApplicationWindowToken(), 0);

                fillShopDetails(shop_name_entered);
            }


        }
    });


    actvShop_name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            actvShop_name.setVisibility(View.VISIBLE);
            txtShop.setVisibility(View.GONE);
        }
    });
    txtShop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            actvShop_name.setVisibility(View.VISIBLE);
            txtShop.setVisibility(View.GONE);
        }
    });

两个方法一起运行时,对话框打开了两次。

【问题讨论】:

    标签: android android-layout android-fragments autocompletetextview


    【解决方案1】:

    我遇到了同样的问题,你现在面临的问题。

    当我们使用addTextChangedListenerthan 时,它会在您的EditText 发生任何更改时触发,无论是通过键入还是以编程方式设置文本(例如从列表中选择一个值,然后在 Editext 上设置)

    您可以使用这两种方法。

    1. 从 AutoCompleteTextView 禁用 addTextChangedListener 侦听器。对于这个点击here
    2. 播放视图可见性(我已成功使用)。为此,您需要在 AutoCompleteTextView 上创建一个新视图(您可以创建 TextView),并将视图的可见性默认设置为 GONE,然后我们将播放像addTextChangedListener 中的代码一样以编程方式查看可见性

    代码:

      @Override
        public void afterTextChanged(Editable s) {
            //do nothing
        YOUR_AUTO_COMPLTE_TEXTVIEW.setVisibility(View.VISIBLE);
        YOUR_TEXTVIEW.setVisibility(View.GONE);
    
        }
    

    setOnItemClickListener 内部,我们需要再次播放视图可见性,并在新的Textview 上设置设置文本,检查如下:-

    actvShop_name.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
                    YOUR_AUTO_COMPLTE_TEXTVIEW.setVisibility(View.GONE);
                    YOUR_TEXTVIEW.setVisibility(View.VISIBLE);
    
                }
    }
    

    并应用点击 YOUR_AUTO_COMPLTE_TEXTVIEW 和 YOUR_TEXTVIEW 设置视图可见性,如下所示

    YOUR_AUTO_COMPLTE_TEXTVIEW.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    YOUR_AUTO_COMPLTE_TEXTVIEW.setVisibility(View.VISIBLE);
                    YOUR_TEXTVIEW.setVisibility(View.GONE);
                }
            });
            YOUR_TEXTVIEW.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    YOUR_AUTO_COMPLTE_TEXTVIEW.setVisibility(View.VISIBLE);
                    YOUR_TEXTVIEW.setVisibility(View.GONE);
                }
            });
    

    【讨论】:

    • 我试过 1. approch but not working 还是同样的问题。
    • 你可以试试第二个,我用过...你有什么问题吗
    • 我添加了但现在同样的问题
    • 怎么可能...您是否创建了AutoTextViewTextView 之类的2 个视图并设置了visibility,正如我在答案中提到的那样..因为我尝试过同样的事情因为它现在完美地工作了
    • 是的,也这样做了。我需要和你分享代码吗?
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多