如何解决Android 如何自动调整微调器的大小下拉菜单
如何根据所选元素的 TextView 宽度自动调整 DropDownMenu 的大小。
As seen by the image below when the 'Short Text' is selected there is unwanted area,this is not a problem if we want to to adjust the start of the menu to another element,but if we want to adjust the end菜单到另一个元素,有一个不应该存在的差距。
所以我的问题是:有没有办法去除不需要的区域,或者至少将 TextView 和 ImageView 调整到右侧? (如下图所示)
以下是全部代码:
..layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.slaviboy.dropdown.DropDownMenu
android:id="@+id/dropDownMenu1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:animationCache="true"
android:background="#00ffff"
android:dropDownWidth="wrap_content"
android:spinnerMode="dropdown"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.slaviboy.dropdown.DropDownMenu
android:id="@+id/dropDownMenu2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:animationCache="true"
android:background="#00ffff"
android:dropDownWidth="wrap_content"
android:spinnerMode="dropdown"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toEndOf="@id/dropDownMenu1"
app:layout_constraintTop_toBottomOf="@id/dropDownMenu1" />
</androidx.constraintlayout.widget.ConstraintLayout>
..layout/drop_down_menu_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00">
<TextView
android:id="@+id/itemName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#ff0000"
android:ellipsize="end"
android:gravity="start|center_vertical"
android:maxLines="1"
android:text="Hello World!"
android:textColor="#5A5A5A"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/downArrowSymbol"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/downArrowSymbol"
android:layout_width="30dp"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:background="#00ff00"
android:padding="4dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_arrow"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="@id/itemName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/itemName"
app:layout_constraintTop_toTopOf="@id/itemName" />
</androidx.constraintlayout.widget.ConstraintLayout>
..drawable/ic_arrow.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="451.847dp"
android:height="451.847dp"
android:viewportWidth="451.847"
android:viewportHeight="451.847">
<path
android:fillColor="#5A5A5A"
android:pathData="M225.923,354.706c-8.098,0 -16.195,-3.092 -22.369,-9.263L9.27,151.157c-12.359,-12.359 -12.359,-32.397 0,-44.751c12.354,-12.354 32.388,-12.354 44.748,0l171.905,171.915l171.906,-171.909c12.359,-12.354 32.391,-12.354 44.744,0c12.365,12.354 12.365,32.392 0,44.751L248.292,345.449C242.115,351.621 234.018,354.706 225.923,354.706z"/>
</vector>
DropDownAdapter.kt
import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import java.util.*
class DropDownAdapter(context: Context,var layoutSrc: Int,var nameList: ArrayList<String>) :
ArrayAdapter<String>(context,nameList),AdapterView.OnItemSelectedListener {
var selectedViewPosition = -1
override fun getCount(): Int {
return nameList.size
}
override fun getItem(position: Int): String {
return nameList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int,convertView: View?,parent: ViewGroup): View {
return initView(position,convertView,parent,true)
}
override fun getDropDownView(position: Int,parent)
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
override fun onItemSelected(parent: AdapterView<*>,view: View,position: Int,id: Long) {
selectedViewPosition = position
}
private fun initView(position: Int,parent: ViewGroup,fromItemSelection: Boolean = false): View {
// inflate the layout if view does not exist
val itemView = convertView ?: LayoutInflater.from(context).inflate(layoutSrc,false)
// get child elements
val itemName: TextView = itemView.findViewById(R.id.itemName)
val dropArrowSymbol: ImageView = itemView.findViewById(R.id.downArrowSymbol)
// get string name
val currentItem: String = getItem(position)
itemName.text = currentItem
if (!fromItemSelection) {
(itemName.layoutParams as ConstraintLayout.LayoutParams).endToStart = -1
dropArrowSymbol.visibility = View.INVISIBLE
} else {
itemName.setTextColor(Color.DKGRAY)
dropArrowSymbol.visibility = View.VISIBLE
(itemName.layoutParams as ConstraintLayout.LayoutParams).setMargins(0,0)
}
return itemView
}
}
下拉菜单.kt
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.ListPopupWindow
import java.lang.Exception
open class DropDownMenu : androidx.appcompat.widget.AppCompatSpinner {
constructor(context: Context) : super(context)
constructor(context: Context,attrs: AttributeSet?) : super(context,attrs)
constructor(context: Context,attrs: AttributeSet?,defStyleAttr: Int) : super(context,attrs,defStyleAttr)
init {
try {
// get private property and make it accessible
val popup = androidx.appcompat.widget.AppCompatSpinner::class.java.getDeclaredField("mPopup")
popup.isAccessible = true
// get the popup window
val popupWindow = popup.get(this) as ListPopupWindow
popupWindow.isModal = false
} catch (e: Exception) {
e.printStackTrace()
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。