ฉันกำลังใช้AutoCompleteTextView
เมื่อผู้ใช้คลิกที่ฉันต้องการแสดงข้อเสนอแนะแม้ว่าจะไม่มีข้อความ - แต่setThreshold(0)
ทำงานเหมือนกับsetThreshold(1)
- ดังนั้นผู้ใช้จะต้องป้อนอย่างน้อย 1 ตัวอักษรเพื่อแสดงคำแนะนำ
ฉันกำลังใช้AutoCompleteTextView
เมื่อผู้ใช้คลิกที่ฉันต้องการแสดงข้อเสนอแนะแม้ว่าจะไม่มีข้อความ - แต่setThreshold(0)
ทำงานเหมือนกับsetThreshold(1)
- ดังนั้นผู้ใช้จะต้องป้อนอย่างน้อย 1 ตัวอักษรเพื่อแสดงคำแนะนำ
คำตอบ:
นี่คือพฤติกรรมที่บันทึกไว้ :
เมื่อ
threshold
น้อยกว่าหรือเท่ากับ 0 จะมีการใช้ขีด จำกัด 1
คุณสามารถแสดงรายการแบบเลื่อนลงผ่านทางด้วยตนเองshowDropDown()
ดังนั้นบางทีคุณสามารถจัดเรียงเพื่อแสดงเมื่อคุณต้องการ หรือคลาสย่อยAutoCompleteTextView
และแทนที่enoughToFilter()
โดยส่งคืนtrue
เวลาทั้งหมด
showDropDown()
ไม่ทำงานafterTextChanged
เมื่อ.getText().toString().length()==0
ใด WHYYY
นี่คือชั้นเรียนของฉันInstantAutoComplete มันเป็นสิ่งที่ระหว่างและAutoCompleteTextView
Spinner
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
public class InstantAutoComplete extends AutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && getAdapter() != null) {
performFiltering(getText(), 0);
}
}
}
ใช้ใน xml ของคุณเช่นนี้:
<your.namespace.InstantAutoComplete ... />
<AutoCompleteTextView ... />
<your.namespace.InstantAutoComplete ... />
ฉันหายไปบางครั้งการหานี้ :)
androidx.appcompat.widget.AppCompatAutoCompleteTextView
ขยาย
วิธีที่ง่ายที่สุด:
เพียงใช้ setOnTouchListener และ showDropDown ()
AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
text.showDropDown();
return false;
}
});
โค้ดของ Destil นั้นยอดเยี่ยมมากเมื่อมีInstantAutoComplete
วัตถุเพียงชิ้นเดียว มันไม่ได้ทำงานกับสองแม้ว่า - ไม่รู้ว่าทำไม แต่เมื่อฉันใส่showDropDown()
(เช่น CommonsWare แนะนำ) ลงในonFocusChanged()
แบบนี้:
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
showDropDown();
}
}
มันแก้ปัญหาได้
มันเป็นเพียงคำตอบสองข้อที่รวมกันอย่างเหมาะสม แต่ฉันหวังว่ามันอาจช่วยใครซักคนได้สักพัก
อะแดปเตอร์ไม่ทำการกรองในตอนแรก
เมื่อไม่ได้ทำการกรองรายการดรอปดาวน์จะว่างเปล่า
ดังนั้นคุณอาจต้องเริ่มการกรองก่อน
ในการทำเช่นนั้นคุณสามารถเรียกใช้filter()
หลังจากคุณเพิ่มรายการเสร็จแล้ว
adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
คุณสามารถใช้ onFocusChangeListener;
TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
TCKimlikNo.showDropDown();
}
}
});
คำตอบของ Destil ด้านบนเกือบจะใช้ได้ แต่มีข้อบกพร่องเล็กน้อย เมื่อผู้ใช้ก่อนให้ความสำคัญกับเขตข้อมูลมันทำงานอย่างไร แต่ถ้าพวกเขาออกแล้วกลับไปที่สนามมันจะไม่แสดงแบบเลื่อนลงเพราะค่าของ mPopupCanBeUpdated จะยังคงเป็นเท็จจากเมื่อมันถูกซ่อนอยู่ การแก้ไขคือการเปลี่ยนวิธี onFocusChanged เป็น:
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
if (getText().toString().length() == 0) {
// We want to trigger the drop down, replace the text.
setText("");
}
}
}
เพื่อให้ CustomAutoCompleteTextView 1. แทนที่เมธอด setThreshold, เพียงพอถึงตัวกรอง, onFocusChanged
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
private int myThreshold;
public CustomAutoCompleteTextView (Context context) {
super(context);
}
public CustomAutoCompleteTextView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomAutoCompleteTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
//set threshold 0.
public void setThreshold(int threshold) {
if (threshold < 0) {
threshold = 0;
}
myThreshold = threshold;
}
//if threshold is 0 than return true
public boolean enoughToFilter() {
return true;
}
//invoke on focus
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
//skip space and backspace
super.performFiltering("", 67);
// TODO Auto-generated method stub
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
protected void performFiltering(CharSequence text, int keyCode) {
// TODO Auto-generated method stub
super.performFiltering(text, keyCode);
}
public int getThreshold() {
return myThreshold;
}
}
ลองมัน
searchAutoComplete.setThreshold(0);
searchAutoComplete.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {//cut last probel
if (charSequence.length() > 1) {
if (charSequence.charAt(charSequence.length() - 1) == ' ') {
searchAutoComplete.setText(charSequence.subSequence(0, charSequence.length() - 1));
searchAutoComplete.setSelection(charSequence.length() - 1);
}
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
//when clicked in autocomplete text view
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.header_search_etv:
if (searchAutoComplete.getText().toString().length() == 0) {
searchAutoComplete.setText(" ");
}
break;
}
}):
เพียงเรียกวิธีนี้เมื่อแตะหรือคลิกเหตุการณ์ของ autoCompleteTextView หรือที่ที่คุณต้องการ
autoCompleteTextView.showDropDown()
สิ่งนี้ใช้งานได้สำหรับฉันรหัสหลอก:
public class CustomAutoCompleteTextView extends AutoCompleteTextView {
public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.showDropDown();
return super.onTouchEvent(event);
}
}
เพียงแค่วางสิ่งนี้กับวิธีการสร้างของคุณใน Java
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
this, android.R.layout.simple_spinner_dropdown_item,
getResources().getStringArray(R.array.Loc_names));
textView1 =(AutoCompleteTextView) findViewById(R.id.acT1);
textView1.setAdapter(arrayAdapter);
textView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View arg0) {
textView1.setMaxLines(5);
textView1.showDropDown();
}
});
และนี่คือไฟล์ Xml ของคุณ ...
<AutoCompleteTextView
android:layout_width="200dp"
android:layout_height="30dp"
android:hint="@string/select_location"
android:id="@+id/acT1"
android:textAlignment="center"/>
และสร้าง Array ใน string.xml ภายใต้ Values ...
<string-array name="Loc_names">
<item>Pakistan</item>
<item>Germany</item>
<item>Russia/NCR</item>
<item>China</item>
<item>India</item>
<item>Sweden</item>
<item>Australia</item>
</string-array>
และคุณจะไปดี
เจ็ดปีต่อมาพวกปัญหายังคงเหมือนเดิม นี่คือคลาสที่มีฟังก์ชั่นที่บังคับให้ป๊อปอัปโง่ที่จะแสดงตัวเองในทุกสภาวะ สิ่งที่คุณต้องทำคือตั้งค่าอะแดปเตอร์เป็น AutoCompleteTextView ของคุณเพิ่มข้อมูลลงไปและshowDropdownNow()
ฟังก์ชั่นการโทรได้ทุกเวลา
เครดิตให้กับ @David Vávra มันขึ้นอยู่กับรหัสของเขา
import android.content.Context
import android.util.AttributeSet
import android.widget.AutoCompleteTextView
class InstantAutoCompleteTextView : AutoCompleteTextView {
constructor(context: Context) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun enoughToFilter(): Boolean {
return true
}
fun showDropdownNow() {
if (adapter != null) {
// Remember a current text
val savedText = text
// Set empty text and perform filtering. As the result we restore all items inside of
// a filter's internal item collection.
setText(null, true)
// Set back the saved text and DO NOT perform filtering. As the result of these steps
// we have a text shown in UI, and what is more important we have items not filtered
setText(savedText, false)
// Move cursor to the end of a text
setSelection(text.length)
// Now we can show a dropdown with full list of options not filtered by displayed text
performFiltering(null, 0)
}
}
}
บน FocusChangeListener ตรวจสอบ
if (hasFocus) {
tvAutoComplete.setText(" ")
ในตัวกรองของคุณเพียงตัดค่านี้:
filter { it.contains(constraint.trim(), true) }
และมันจะแสดงคำแนะนำทั้งหมดเมื่อคุณมุ่งเน้นไปที่มุมมองนี้