Android 如何使材质ExposedDropdownMenu具有多行下拉项布局?

Android 如何使材质ExposedDropdownMenu具有多行下拉项布局?,android,drop-down-menu,material-design,Android,Drop Down Menu,Material Design,我尝试在下拉菜单中实现材质ExposedDropdownMenu。元素的名称非常长,我需要完整地显示它们,但是下拉列表只显示一行,并且名称被截断。我怎样才能修好它 我尝试了不同风格的TextInputLayout和AutoCompleteTextViewsingleLine=true、line=4和maxLines=4也没有帮助 ExposedDropdownMenu <com.google.android.material.textfield.TextInputLayout an

我尝试在下拉菜单中实现材质ExposedDropdownMenu。元素的名称非常长,我需要完整地显示它们,但是下拉列表只显示一行,并且名称被截断。我怎样才能修好它

我尝试了不同风格的TextInputLayout和AutoCompleteTextView<下拉项布局中的code>singleLine=true、
line=4
maxLines=4
也没有帮助

ExposedDropdownMenu

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/trotuar_plity_spinner"
 style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/trotuar_plity_subtitle"
    android:layout_marginTop="8dp"
    android:layout_marginStart="32dp"
    android:layout_marginEnd="32dp"
    android:hint="Плиты">

    <AutoCompleteTextView
        android:id="@+id/trotuar_plity_dropdown"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:editable="false"
        android:singleLine="false"/>
</com.google.android.material.textfield.TextInputLayout>

下拉项布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:singleLine="false"
    android:maxLines="4"
    android:lines="4"
    android:textAppearance="?attr/textAppearanceSubtitle1"/>

下拉初始化:

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
    AutoCompleteTextView spinnerDropdown = requireView().findViewById(R.id.tv_dropdown);
    mViewModel.getItems().observe(getViewLifecycleOwner(), (items -> {
        ArrayAdapter<String> adapter = new ArrayAdapter<>(requireContext(), R.layout.spinner_dropdown_item, items);
//            adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
        spinnerDropdown.setAdapter(adapter);
    }));
}
activityCreated上的公共void(@Nullable Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
mViewModel=ViewModelProviders.of(this.get)(MyViewModel.class);
AutoCompleteTextView spinnerDropdown=RequireReview().findViewById(R.id.tv_下拉菜单);
mViewModel.getItems().observe(getViewLifecycleOwner(),(项->{
ArrayAdapter=新的ArrayAdapter(requireContext(),R.layout.spinner\u下拉菜单\u项,项);
//adapter.setDropDownViewResource(R.layout.spinner\u下拉项);
喷丝头下拉列表。设置适配器(适配器);
}));
}

因此,在使用自定义适配器尝试了几种方法后,我找到了一种非常有技巧的方法,但它可以工作:

我还没来得及清理这个问题,但诀窍是在
getView()
中的水平滚动上发布一个强制禁用

类CustomArrayAdapter(上下文:上下文,
@LayoutRes private val layoutResource:Int,
@IdRes private val textViewResourceId:Int=0):阵列适配器(上下文,布局资源){
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
val view=createViewFromResource(convertView、父级、layoutResource)
view.post{
view.setHorizontallyScrolling(false)
}
返回bindData(getItem(位置)!!,视图)
}
覆盖getDropDownView(位置:Int,convertView:View?,父级:ViewGroup):视图{
val view=createViewFromResource(转换视图、父级、R.layout.下拉菜单\弹出菜单\项)
返回bindData(getItem(位置)!!,视图)
}
private fun createViewFromResource(convertView:View?,父级:ViewGroup,layoutResource:Int):TextView{
val context=parent.context
val view=convertView?:LayoutFlater.from(上下文)。充气(layoutResource,parent,false)
回击{
如果(textViewResourceId==0)作为TextView查看
否则{
view.findViewById(textViewResourceId)?:
抛出RuntimeException(“未能找到ID为的视图”+
“${context.resources.getResourceName(textViewResourceId)}在项目布局中”)
}
}捕获(例如:ClassCastException){
Log.e(“CustomArrayAdapter”,“必须为TextView提供资源ID”)
抛出非法状态异常(
“ArrayAdapter要求资源ID为TextView”,例如)
}
}
私有数据(值:字符串,视图:TextView):TextView{
view.text=值
返回视图
}
}

因此,在使用自定义适配器尝试了几种方法后,我找到了一种非常有技巧的方法,但它可以工作:

我还没来得及清理这个问题,但诀窍是在
getView()
中的水平滚动上发布一个强制禁用

类CustomArrayAdapter(上下文:上下文,
@LayoutRes private val layoutResource:Int,
@IdRes private val textViewResourceId:Int=0):阵列适配器(上下文,布局资源){
覆盖视图(位置:Int,convertView:View?,父级:ViewGroup):视图{
val view=createViewFromResource(convertView、父级、layoutResource)
view.post{
view.setHorizontallyScrolling(false)
}
返回bindData(getItem(位置)!!,视图)
}
覆盖getDropDownView(位置:Int,convertView:View?,父级:ViewGroup):视图{
val view=createViewFromResource(转换视图、父级、R.layout.下拉菜单\弹出菜单\项)
返回bindData(getItem(位置)!!,视图)
}
private fun createViewFromResource(convertView:View?,父级:ViewGroup,layoutResource:Int):TextView{
val context=parent.context
val view=convertView?:LayoutFlater.from(上下文)。充气(layoutResource,parent,false)
回击{
如果(textViewResourceId==0)作为TextView查看
否则{
view.findViewById(textViewResourceId)?:
抛出RuntimeException(“未能找到ID为的视图”+
“${context.resources.getResourceName(textViewResourceId)}在项目布局中”)
}
}捕获(例如:ClassCastException){
Log.e(“CustomArrayAdapter”,“必须为TextView提供资源ID”)
抛出非法状态异常(
“ArrayAdapter要求资源ID为TextView”,例如)
}
}
私有数据(值:字符串,视图:TextView):TextView{
view.text=值
返回视图
}
}

使用微调器尝试SDK中的默认布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@android:id/text1"
      style="?attr/spinnerDropDownItemStyle"
      android:singleLine="true"
      android:layout_width="match_parent"
      android:layout_height="?attr/dropdownListPreferredItemHeight"
      android:ellipsize="marquee"/>


关键是要使用:
省略“marquee”
它将显示并为您的全文提供一个可水平滚动的页面。

尝试使用微调器在SDK中定义的布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@android:id/text1"
      style="?attr/spinnerDropDownItemStyle"
      android:singleLine="true"
      android:layout_width="match_parent"
      android:layout_height="?attr/dropdownListPreferredItemHeight"
      android:ellipsize="marquee"/>


关键是要使用:
省略“marquee”
它将显示并为您的全文提供一个水平滚动页面。

有没有想到过这一点…?我想有可能覆盖下拉列表的样式或用自定义布局替换其布局,但从那时起我就没有处理过这个问题。也许我以后会试试。有没有想过…?我想有可能覆盖下拉列表的样式或用自定义的布局替换它们,但从那以后我就没有处理过这个问题。也许我以后再试试