資源文件都可以在百度云盤中找到:
鏈接:https://pan.baidu.com/s/1EegFNEv6X2yqi6cJ9iStJQ
提取碼:f6zp
___
為了實現下拉框,這里首先定義主布局文件:
~~~
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:hint="請輸入內容"
android:id="@+id/editText"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="42dp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/down_arrow"
android:layout_alignRight="@id/editText"
android:layout_alignTop="@id/editText"
>
</ImageView>
</RelativeLayout>
~~~
對應效果:

然后就需要為其添加動態點擊事件,以及彈出窗口,對于彈出窗口這里使用popupwindow。也就是在下拉圖片點擊的時候,就彈出菜單:
~~~
/**
* 下拉框
*/
class MainActivity : AppCompatActivity() {
val editText by lazy {findViewById<EditText>(R.id.editText)}
val imageview by lazy {findViewById<ImageView>(R.id.imageview)}
var listView: ListView? = null
var popupWindow: PopupWindow? = null
val datas = listOf("123", "測試", "123", "測試", "123", "測試")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
listView = ListView(this)
listView?.adapter = MyListViewAdapter(this, R.layout.item, datas.toMutableList())
imageview.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
// 創建PopupWindow
if(popupWindow == null){
popupWindow = PopupWindow()
popupWindow?.width = editText.width
popupWindow?.height = dp2pix(200f)
// 指定了布局為動態創建的ListView
popupWindow?.contentView = listView
popupWindow?.isFocusable = true // 設置焦點,系統就會把各種事件交給popup來處理
}
popupWindow?.showAsDropDown(editText, 0, 0)
}
})
}
fun dp2pix(value: Float): Int{
return (resources.displayMetrics.density * value).toInt()
}
}
~~~
由于我們在上面代碼中指定了popupWindow的布局為一個ListView,這里我們就需要定義一個適配器對象:
~~~
class MyListViewAdapter(context: Context, resource: Int, datas: MutableList<String>): BaseAdapter(){
var mCtx: Context = context
var mDatas: MutableList<String> = datas
var mResId: Int = resource
override fun getCount(): Int {
return mDatas.size
}
override fun getItem(position: Int): Any {
return position
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var view: MyViewHolder? = null
var tempView: View? = null
if(convertView == null){
tempView = View.inflate(mCtx, mResId, null) as View
view = MyViewHolder()
view.title = tempView.findViewById<TextView>(R.id.textView)
view.delete = tempView.findViewById<ImageView>(R.id.delete)
} else {
tempView = convertView
view = tempView.getTag() as MyViewHolder
}
// 設置標題
val msg = mDatas.get(position)
view.title?.text = msg
// 設置刪除按鈕監聽
view.delete?.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
mDatas.remove(msg)
// 通知數據發生改變
notifyDataSetChanged()
}
})
// 緩存實例化的view
tempView.setTag(view)
return tempView
}
inner class MyViewHolder{
var delete: ImageView? = null
var title: TextView? = null
}
}
~~~
當然這里按道理應該使用RecyclerView,因為是鞏固和復習一下kotlin這個語言,所以選擇了使用ListView。對應的布局item.xml:
~~~
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="請輸入內容"
android:layout_weight="4"
android:layout_gravity="center"
android:textColor="@color/black"
android:textSize="20sp"/>
<ImageView
android:id="@+id/delete"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/delete" />
</LinearLayout>
~~~
最終效果就是點擊下拉框可展開,然后彈出一個下拉框:

點擊X可以進行該項的移除,當然也可以為每項添加一個事件,然后為EditText賦值:
~~~
listView?.setOnItemClickListener(object :AdapterView.OnItemClickListener{
override fun onItemClick(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
editText.setText(datas[position])
// 關閉窗口
popupWindow?.apply {
if(isShowing){
popupWindow?.dismiss()
popupWindow = null
}
}
}
})
~~~
- 介紹
- UI
- MaterialButton
- MaterialButtonToggleGroup
- 字體相關設置
- Material Design
- Toolbar
- 下拉刷新
- 可折疊式標題欄
- 懸浮按鈕
- 滑動菜單DrawerLayout
- NavigationView
- 可交互提示
- CoordinatorLayout
- 卡片式布局
- 搜索框SearchView
- 自定義View
- 簡單封裝單選
- RecyclerView
- xml設置點擊樣式
- adb
- 連接真機
- 小技巧
- 通過字符串ID獲取資源
- 自定義View組件
- 使用系統控件重新組合
- 旋轉菜單
- 輪播圖
- 下拉輸入框
- 自定義VIew
- 圖片組合的開關按鈕
- 自定義ViewPager
- 聯系人快速索引案例
- 使用ListView定義側滑菜單
- 下拉粘黏效果
- 滑動沖突
- 滑動沖突之非同向沖突
- onMeasure
- 繪制字體
- 設置畫筆Paint
- 貝賽爾曲線
- Invalidate和PostInvalidate
- super.onTouchEvent(event)?
- setShadowLayer與陰影效果
- Shader
- ImageView的scaleType屬性
- 漸變
- LinearGradient
- 圖像混合模式
- PorterDuffXfermode
- 橡皮擦效果
- Matrix
- 離屏繪制
- Canvas和圖層
- Canvas簡介
- Canvas中常用操作總結
- Shape
- 圓角屬性
- Android常見動畫
- Android動畫簡介
- View動畫
- 自定義View動畫
- View動畫的特殊使用場景
- LayoutAnimation
- Activity的切換轉場效果
- 屬性動畫
- 幀動畫
- 屬性動畫監聽
- 插值器和估值器
- 工具
- dp和px的轉換
- 獲取屏幕寬高
- JNI
- javah命令
- C和Java相互調用
- WebView
- Android Studio快捷鍵
- Bitmap和Drawable圖像
- Bitmap簡要介紹
- 圖片縮放和裁剪效果
- 創建指定顏色的Bitmap圖像
- Gradle本地倉庫
- Gradle小技巧
- RxJava+Okhttp+Retrofit構建網絡模塊
- 服務器相關配置
- node環境配置
- 3D特效