AutoCompleteTextView - 如何删除顶部和底部的边距?
AutoCompleteTextView - How to remove margin from top and bottom?
我正在使用 AutoCompleteTextView
创建下拉菜单。如何删除列表顶部和底部的默认边距?
重新创建:
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:boxBackgroundColor="@color/white"
android:focusable="false"
app:boxStrokeWidth="1.5dp"
app:layout_constraintTop_toBottomOf="@+id/spinner_network">
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="250dp"
android:layout_height="match_parent"
android:inputType="none"
android:dropDownHeight="200dp"
android:text="Select age" />
</com.google.android.material.textfield.TextInputLayout>
List<String> dropdownItems = new ArrayList<>();
for(int i = 1; i <= 100; i++){
dropdownItems.add(String.valueOf(i));
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(
this, R.layout.dropdown_item, dropdownItems
);
AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setAdapter(spinnerAdapter);
R.layout.dropdown_item
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView"
android:layout_width="match_parent"
android:textColor="@color/black"
android:padding="14dp"
android:layout_height="wrap_content"
android:text="TextView" />
尝试从 AutoCompleteTextView
中删除 dropDownHeight
属性
android:dropDownHeight="200dp" --> remove this line
并将您的 AutoCompleteTextView 高度设置为 wrap_content
。
更新
All the credits and efforts back to @MikeM. from the comments. Many thanks to his efforts.
原因
填充来自 TextInputLayout
本身,它的 DropdownMenuEndIconDelegate
sets some MaterialShapeDrawables
as the dropdown's background. The value of the vertical padding is 8dp which taken from this resource dimen.
解决方案 1:
将此资源维度覆盖为 0dp:
<dimen name="mtrl_exposed_dropdown_menu_popup_vertical_padding" tools:override="true">0dp</dimen>
解决方案 2:
之前的解决方案将应用于所有 AutoCompleteTextView
,但如果您想对某些特定的执行此操作:更改默认的 dropDown 背景可绘制对象,例如:
autoCompleteTextView.setDropDownBackgroundDrawable(new ColorDrawable(Color.WHITE));
带反射(不推荐,因为它是反模式)
mPopup
field 可以在内部访问 AutoCompleteTextView
的下拉弹出窗口。要通过反射获得它:
// Java:
public static ListPopupWindow getPopup(AutoCompleteTextView autoCompleteTextView) {
try {
Field field = AutoCompleteTextView.class.getDeclaredField("mPopup");
field.setAccessible(true);
return (ListPopupWindow) field.get(autoCompleteTextView);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
// Kotlin:
fun AutoCompleteTextView.getPopup(): ListPopupWindow? {
try {
val field = AutoCompleteTextView::class.java.getDeclaredField("mPopup")
field.isAccessible = true
return field.get(this) as ListPopupWindow
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
return null
}
然后通过将其设置为内部的父视图来删除填充 ListView
:
// Java:
autoCompleteTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListPopupWindow popup = getPopup(autoCompleteTextView);
if (popup != null) {
ListView listView = popup.getListView();
if (listView!= null)
((View) listView.getParent()).setPadding(0, 0, 0, 0);
}
}
});
// Kotlin
autoCompleteTextView.setOnClickListener {
val popUp = autoCompleteTextView2.getPopup()?.listView?.parent
if (popUp != null)
(popUp as View).setPadding(0, 0, 0, 0)
}
这是在 OnClickListener
中完成的,因为当用户点击列表时,可空性检查将不匹配。
它不会让我编辑答案,而是 https://whosebug.com/users/2850651/mike-m 的另一个解决方案
删除填充:
在 autoCompleteTextView
中调用 .showDropDown()
.setOnClickListener()
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="250dp"
android:layout_height="50dp"
android:drawableEnd="@drawable/ic_arrow_drop_down"
android:dropDownHeight="200dp"
android:inputType="none"
android:text="Select age"
...../>
List<String> dropdownItems = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
dropdownItems.add(String.valueOf(i));
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(
this, R.layout.dropdown_item, dropdownItems
);
MaterialAutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setAdapter(spinnerAdapter);
//.showDropDown() removes the padding
autoCompleteTextView.setOnClickListener(v -> autoCompleteTextView.showDropDown());
我正在使用 AutoCompleteTextView
创建下拉菜单。如何删除列表顶部和底部的默认边距?
重新创建:
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:boxBackgroundColor="@color/white"
android:focusable="false"
app:boxStrokeWidth="1.5dp"
app:layout_constraintTop_toBottomOf="@+id/spinner_network">
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="250dp"
android:layout_height="match_parent"
android:inputType="none"
android:dropDownHeight="200dp"
android:text="Select age" />
</com.google.android.material.textfield.TextInputLayout>
List<String> dropdownItems = new ArrayList<>();
for(int i = 1; i <= 100; i++){
dropdownItems.add(String.valueOf(i));
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(
this, R.layout.dropdown_item, dropdownItems
);
AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setAdapter(spinnerAdapter);
R.layout.dropdown_item
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView"
android:layout_width="match_parent"
android:textColor="@color/black"
android:padding="14dp"
android:layout_height="wrap_content"
android:text="TextView" />
尝试从 AutoCompleteTextView
中删除dropDownHeight
属性
android:dropDownHeight="200dp" --> remove this line
并将您的 AutoCompleteTextView 高度设置为 wrap_content
。
更新
All the credits and efforts back to @MikeM. from the comments. Many thanks to his efforts.
原因
填充来自 TextInputLayout
本身,它的 DropdownMenuEndIconDelegate
sets some MaterialShapeDrawables
as the dropdown's background. The value of the vertical padding is 8dp which taken from this resource dimen.
解决方案 1:
将此资源维度覆盖为 0dp:
<dimen name="mtrl_exposed_dropdown_menu_popup_vertical_padding" tools:override="true">0dp</dimen>
解决方案 2:
之前的解决方案将应用于所有 AutoCompleteTextView
,但如果您想对某些特定的执行此操作:更改默认的 dropDown 背景可绘制对象,例如:
autoCompleteTextView.setDropDownBackgroundDrawable(new ColorDrawable(Color.WHITE));
带反射(不推荐,因为它是反模式)
mPopup
field 可以在内部访问 AutoCompleteTextView
的下拉弹出窗口。要通过反射获得它:
// Java:
public static ListPopupWindow getPopup(AutoCompleteTextView autoCompleteTextView) {
try {
Field field = AutoCompleteTextView.class.getDeclaredField("mPopup");
field.setAccessible(true);
return (ListPopupWindow) field.get(autoCompleteTextView);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
// Kotlin:
fun AutoCompleteTextView.getPopup(): ListPopupWindow? {
try {
val field = AutoCompleteTextView::class.java.getDeclaredField("mPopup")
field.isAccessible = true
return field.get(this) as ListPopupWindow
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
return null
}
然后通过将其设置为内部的父视图来删除填充 ListView
:
// Java:
autoCompleteTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListPopupWindow popup = getPopup(autoCompleteTextView);
if (popup != null) {
ListView listView = popup.getListView();
if (listView!= null)
((View) listView.getParent()).setPadding(0, 0, 0, 0);
}
}
});
// Kotlin
autoCompleteTextView.setOnClickListener {
val popUp = autoCompleteTextView2.getPopup()?.listView?.parent
if (popUp != null)
(popUp as View).setPadding(0, 0, 0, 0)
}
这是在 OnClickListener
中完成的,因为当用户点击列表时,可空性检查将不匹配。
它不会让我编辑答案,而是 https://whosebug.com/users/2850651/mike-m 的另一个解决方案 删除填充:
在 autoCompleteTextView
中调用 .showDropDown()
.setOnClickListener()
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="250dp"
android:layout_height="50dp"
android:drawableEnd="@drawable/ic_arrow_drop_down"
android:dropDownHeight="200dp"
android:inputType="none"
android:text="Select age"
...../>
List<String> dropdownItems = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
dropdownItems.add(String.valueOf(i));
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(
this, R.layout.dropdown_item, dropdownItems
);
MaterialAutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setAdapter(spinnerAdapter);
//.showDropDown() removes the padding
autoCompleteTextView.setOnClickListener(v -> autoCompleteTextView.showDropDown());