Android 如何避免在AutoCompleteTextView上同时调用:OnItemClick和ContextChanged

Android 如何避免在AutoCompleteTextView上同时调用:OnItemClick和ContextChanged,android,autocompletetextview,textchanged,Android,Autocompletetextview,Textchanged,我有这个密码。当我从建议列表中选择一个项目时,ContextChanged首先发生,然后oItemClicked发生。现在我想在选择一个单词时,先出现“onItemClicked”,然后出现“onTextChanged”。我看了一下Android doc,但它没有提到这个话题 package com.autocompletetest; import java.util.Arrays; import java.util.List; import android.app.Activity; i

我有这个密码。当我从建议列表中选择一个项目时,ContextChanged首先发生,然后oItemClicked发生。现在我想在选择一个单词时,先出现“onItemClicked”,然后出现“onTextChanged”。我看了一下Android doc,但它没有提到这个话题

package com.autocompletetest;


import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {
    private AutoCompleteTextView textView;

    private static final String[] TEMP = new String[] {
        "Beep", "Belgium", "Best", "Bubble", "Bye"
    };
    @Override
    protected void onCreate(final Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        textView.setOnItemClickListener(this);
        textView.addTextChangedListener(this);
        textView.setThreshold(1);

        final List<String> list = Arrays.asList(TEMP);

        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                OnItemClickAndOnTextChangedActivity.this,
                android.R.layout.simple_dropdown_item_1line, list);
        textView.setAdapter(adapter);
    }

    @Override
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
        System.out.println("OnTextChanged.");
    }

    @Override
    public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
        System.out.println("OnItemClick.");
    }

    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
    }

    @Override
    public void afterTextChanged(final Editable s) {

    }

}
package com.autocompletetest;
导入java.util.array;
导入java.util.List;
导入android.app.Activity;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.AutoCompleteTextView;
公共类OnItemClickAndOnTextChangedActivity扩展活动实现TextWatcher、OnItemClickListener{
私有自动完成文本视图文本视图;
私有静态最终字符串[]临时=新字符串[]{
“哔”,“比利时”,“最佳”,“泡泡”,“再见”
};
@凌驾
创建时受保护的空隙(最后一束冰柱){
超级冰柱;
setContentView(R.layout.main);
textView=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
setOnItemClickListener(这个);
textView.addTextChangedListener(此);
设置阈值(1);
最终列表=Arrays.asList(TEMP);
最终ArrayAdapter适配器=新的ArrayAdapter(
OnItemClickAndContextChangedActivity.this,
android.R.layout.simple\u下拉菜单\u项目\u 1行,列表);
setAdapter(适配器);
}
@凌驾
public void onTextChanged(最终字符序列、最终整数开始、最终整数之前、最终整数计数){
System.out.println(“OnTextChanged”);
}
@凌驾
public void onItemClick(最终适配器视图父视图、最终视图视图、最终整型位置、最终长id){
System.out.println(“OnItemClick”);
}
@凌驾
更改前文本之前的公共无效(最终字符序列、最终整数开始、最终整数计数、最终整数之后){
}
@凌驾
公共无效后文本更改(最终可编辑){
}
}
更新: 具体来说,这是我真正想做的事情。有些东西与问题标题无关

package com.autocompletetest;


import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener {
    private AutoCompleteTextView textView;
    private boolean itemClicked;

    private static final String[] TEMP = new String[] {
        "Beep", "Belgium", "Best", "Bubble", "Bye"
    };
    @Override
    protected void onCreate(final Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        textView.setOnItemClickListener(this);
        textView.addTextChangedListener(this);
        textView.setThreshold(1);

        final List<String> list = Arrays.asList(TEMP);

        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                OnItemClickAndOnTextChangedActivity.this,
                android.R.layout.simple_dropdown_item_1line, list);
        textView.setAdapter(adapter);
    }

    @Override
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
        System.out.println("OnTextChanged.");

        // The below code block does:
        // When type a word, make a new ArrayAdapter and set it for textView
        // If any of word in suggestion list is clicked, nothing changes, dropdown list not shown.
        if(itemClicked) {
            itemClicked = false;
        } else {
            // Create new ArrayAdapter.
            // textView is set to new ArrayAdapter.
            // textView.showDropDown()
        }
    }

    @Override
    public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
        System.out.println("OnItemClick.");
        itemClicked = true;
    }

    @Override
    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
    }

    @Override
    public void afterTextChanged(final Editable s) {

    }
}
package com.autocompletetest;
导入java.util.array;
导入java.util.List;
导入android.app.Activity;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ArrayAdapter;
导入android.widget.AutoCompleteTextView;
公共类OnItemClickAndOnTextChangedActivity扩展活动实现TextWatcher、OnItemClickListener{
私有自动完成文本视图文本视图;
私有布尔项;
私有静态最终字符串[]临时=新字符串[]{
“哔”,“比利时”,“最佳”,“泡泡”,“再见”
};
@凌驾
创建时受保护的空隙(最后一束冰柱){
超级冰柱;
setContentView(R.layout.main);
textView=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
setOnItemClickListener(这个);
textView.addTextChangedListener(此);
设置阈值(1);
最终列表=Arrays.asList(TEMP);
最终ArrayAdapter适配器=新的ArrayAdapter(
OnItemClickAndContextChangedActivity.this,
android.R.layout.simple\u下拉菜单\u项目\u 1行,列表);
setAdapter(适配器);
}
@凌驾
public void onTextChanged(最终字符序列、最终整数开始、最终整数之前、最终整数计数){
System.out.println(“OnTextChanged”);
//下面的代码块执行以下操作:
//键入单词时,创建新的ArrayAdapter并将其设置为textView
//若点击了建议列表中的任何一个单词,并没有任何变化,下拉列表不会显示。
如果(单击项){
itemClicked=false;
}否则{
//创建新的ArrayAdapter。
//textView已设置为new ArrayAdapter。
//textView.showDropDown()
}
}
@凌驾
public void onItemClick(最终适配器视图父视图、最终视图视图、最终整型位置、最终长id){
System.out.println(“OnItemClick”);
itemClicked=true;
}
@凌驾
更改前文本之前的公共无效(最终字符序列、最终整数开始、最终整数计数、最终整数之后){
}
@凌驾
公共无效后文本更改(最终可编辑){
}
}

对于这个问题没有特别的解决方案。我建议您应该在textchangedlistener()开头的onclicklistener()中添加代码因此,您希望首先执行的代码将首先执行,然后您希望最后执行的代码将最后执行。希望这将对您有所帮助。

isPerformingCompletion()已添加到API级别3中。从下拉列表中选择一个项目并将触发TextWatcher侦听器后,返回true。简言之,为避免上述行为:

public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (autoCompleteView.isPerformingCompletion()) {
        // An item has been selected from the list. Ignore.
        return;
    }

    // Your code for a general case
}

实际上我有一个布尔变量“itemClicked”,当单击建议列表中的一个项目时,它将为真。每次文本更改时,我都要检查“itemClicked”。问题是。。单击单词后,onItemClicked之前会发生onTextChanged。您可以做一件事。正如我所说,有一个特定的解决方案,因为textchange将首先被调用。因此,您将位于textChangedListener()中的代码放在函数中,并在onItemClicked()的末尾调用该函数。我想这会有用的。你有没有检查什么时候调用了
beforeTextChanged()
。?为什么你不能在OnclickListener()中做所有的事情?是的,我做了。TextWatcher的所有功能都发生在onItemClick之前。读者注意:不要在下面接受答案的情况下停止,阅读答案中的真正解决方案