Skip to content

Commit 0623de5

Browse files
committed
修复android8以下弹出popupmenu时崩溃
1 parent fa1e5c3 commit 0623de5

File tree

1 file changed

+78
-19
lines changed

1 file changed

+78
-19
lines changed

app/src/main/java/remix/myplayer/ui/misc/MultipleChoice.kt

+78-19
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ package remix.myplayer.ui.misc
22

33
import android.annotation.SuppressLint
44
import android.app.Activity
5+
import android.graphics.Color
6+
import android.graphics.drawable.ColorDrawable
7+
import android.graphics.drawable.GradientDrawable
58
import android.text.TextUtils
9+
import android.view.Gravity
610
import android.view.View
7-
import android.widget.PopupMenu
8-
import com.tencent.bugly.crashreport.CrashReport
11+
import android.widget.PopupWindow
12+
import androidx.appcompat.widget.AppCompatTextView
913
import io.reactivex.Single
1014
import io.reactivex.android.schedulers.AndroidSchedulers
1115
import io.reactivex.disposables.CompositeDisposable
@@ -23,11 +27,23 @@ import remix.myplayer.db.room.model.PlayList
2327
import remix.myplayer.misc.getSongIds
2428
import remix.myplayer.theme.Theme
2529
import remix.myplayer.theme.Theme.getBaseDialog
30+
import remix.myplayer.theme.ThemeStore
2631
import remix.myplayer.ui.activity.base.BaseActivity
27-
import remix.myplayer.ui.adapter.*
32+
import remix.myplayer.ui.adapter.AlbumAdapter
33+
import remix.myplayer.ui.adapter.ArtistAdapter
34+
import remix.myplayer.ui.adapter.BaseAdapter
35+
import remix.myplayer.ui.adapter.ChildHolderAdapter
36+
import remix.myplayer.ui.adapter.GenreAdapter
37+
import remix.myplayer.ui.adapter.PlayListAdapter
38+
import remix.myplayer.ui.adapter.SongAdapter
2839
import remix.myplayer.ui.widget.MultiPopupWindow
29-
import remix.myplayer.util.*
40+
import remix.myplayer.util.Constants
41+
import remix.myplayer.util.DensityUtil
42+
import remix.myplayer.util.MediaStoreUtil
3043
import remix.myplayer.util.RxUtil.applySingleScheduler
44+
import remix.myplayer.util.SPUtil
45+
import remix.myplayer.util.ToastUtil
46+
import remix.myplayer.util.Util
3147
import java.lang.ref.WeakReference
3248

3349
class MultipleChoice<T>(activity: Activity, val type: Int) {
@@ -46,6 +62,7 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
4662
var isActive: Boolean = false
4763
var adapter: BaseAdapter<T, *>? = null
4864
private var popup: MultiPopupWindow? = null
65+
private var menuPopup: MenuPopup? = null
4966
var extra: Long = 0
5067

5168
private fun getSongsSingle(ids: List<Long>): Single<List<Song>> {
@@ -71,26 +88,31 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
7188
ids.add((it as Song).id)
7289
}
7390
}
91+
7492
Constants.ALBUM -> {
7593
checkParam.forEach {
7694
ids.addAll((it as Album).getSongIds())
7795
}
7896
}
97+
7998
Constants.ARTIST -> {
8099
checkParam.forEach {
81100
ids.addAll((it as Artist).getSongIds())
82101
}
83102
}
103+
84104
Constants.PLAYLIST -> {
85105
checkParam.forEach {
86106
ids.addAll((it as PlayList).audioIds)
87107
}
88108
}
109+
89110
Constants.FOLDER -> {
90111
checkParam.forEach {
91112
ids.addAll((it as Folder).getSongIds())
92113
}
93114
}
115+
94116
Constants.GENRE -> {
95117
checkParam.forEach {
96118
ids.addAll((it as Genre).getSongIds())
@@ -111,26 +133,31 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
111133
ids.add((it as Song).id)
112134
}
113135
}
136+
114137
Constants.ALBUM -> {
115138
checkParam.forEach {
116139
ids.addAll((it as Album).getSongIds())
117140
}
118141
}
142+
119143
Constants.ARTIST -> {
120144
checkParam.forEach {
121145
ids.addAll((it as Artist).getSongIds())
122146
}
123147
}
148+
124149
Constants.PLAYLIST -> {
125150
checkParam.forEach {
126151
ids.addAll((it as PlayList).audioIds.toList())
127152
}
128153
}
154+
129155
Constants.FOLDER -> {
130156
checkParam.forEach {
131157
ids.addAll((it as Folder).getSongIds())
132158
}
133159
}
160+
134161
Constants.GENRE -> {
135162
checkParam.forEach {
136163
ids.addAll((it as Genre).getSongIds())
@@ -200,13 +227,15 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
200227

201228
songs.size
202229
}
230+
203231
Constants.PLAYLISTSONG -> { //删除播放列表内歌曲
204232
if (deleteSource) {
205233
MediaStoreUtil.delete(activityRef.get() as BaseActivity, songs, true)
206234
} else {
207235
databaseRepository.deleteFromPlayList(songs.map { it.id }, extra).blockingGet()
208236
}
209237
}
238+
210239
else -> {
211240
MediaStoreUtil.delete(activityRef.get() as BaseActivity, songs, deleteSource)
212241
}
@@ -396,6 +425,8 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
396425
if (activity.isDestroyed || activity.isFinishing || !activity.hasWindowFocus()) {
397426
return
398427
}
428+
val anchor = View(activity)
429+
399430
popup = MultiPopupWindow(activity)
400431
popup!!.binding.multiClose.setOnClickListener { close() }
401432
popup!!.binding.multiPlaylist.setOnClickListener { addToPlayList() }
@@ -405,27 +436,26 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
405436
}
406437
popup!!.binding.multiDelete.setOnClickListener { delete() }
407438
popup!!.binding.multiMore.setOnClickListener {
408-
PopupMenu(activity, popup!!.binding.multiMore).run {
409-
inflate(R.menu.menu_multi_select_more)
410-
setOnMenuItemClickListener {
411-
when (it.itemId) {
412-
R.id.select_all -> selectAll()
413-
}
414-
true
415-
}
416-
if (!activity.isFinishing && !activity.isDestroyed && activity.hasWindowFocus()) {
417-
try {
418-
show()
419-
} catch (e: Exception) {
420-
CrashReport.postCatchedException(Exception("ac: $activity", e))
421-
}
439+
menuPopup?.dismiss()
440+
menuPopup = MenuPopup(activity).apply {
441+
contentView?.setOnClickListener {
442+
selectAll()
443+
dismiss()
422444
}
445+
contentView.measure(0, 0)
446+
showAsDropDown(anchor, activity.window.decorView.measuredWidth - contentView.measuredWidth, popup!!.contentView.measuredHeight - DensityUtil.dip2px(8f))
423447
}
424448
}
425-
popup!!.show(View(activity))
449+
popup!!.show(anchor)
426450
}
427451

428452
fun close() {
453+
if (menuPopup?.isShowing == true) {
454+
menuPopup?.dismiss()
455+
menuPopup = null
456+
return
457+
}
458+
429459
disposableContainer.clear()
430460
isActive = false
431461
isActiveSomeWhere = false
@@ -442,6 +472,35 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
442472
return "MultipleChoice(activity=${activityRef.get()}, type=$type, checkPos=$checkPos, checkParam=$checkParam, isActive=$isActive, adapter=$adapter, popup=$popup, extra=$extra)"
443473
}
444474

475+
private class MenuPopup(activity: Activity) : PopupWindow(activity) {
476+
477+
init {
478+
val textView = AppCompatTextView(activity)
479+
textView.setText(R.string.select_all)
480+
textView.setPadding(DensityUtil.dip2px(16f),
481+
DensityUtil.dip2px(16f),
482+
DensityUtil.dip2px(128f),
483+
DensityUtil.dip2px(16f))
484+
textView.textSize = 16f
485+
textView.gravity = Gravity.CENTER_VERTICAL or Gravity.START
486+
textView.setTextColor(if (ThemeStore.isLightTheme) Color.BLACK else Color.WHITE)
487+
textView.setBackgroundDrawable(GradientDrawable().apply {
488+
setColor(ThemeStore.getBackgroundColorMain(activity))
489+
val corner = DensityUtil.dip2px(2f).toFloat()
490+
cornerRadii = floatArrayOf(
491+
corner, corner,
492+
0f, 0f,
493+
0f, 0f,
494+
corner, corner
495+
)
496+
})
497+
498+
setContentView(textView)
499+
500+
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
501+
}
502+
}
503+
445504

446505
companion object {
447506
@JvmStatic

0 commit comments

Comments
 (0)