diff --git a/LibDialog/build.gradle b/LibDialog/build.gradle index 89957a34aaf35223afa27997ee6330fd95a3fc82..5a923c91062e0d2e865a0dd384705d08052cf839 100644 --- a/LibDialog/build.gradle +++ b/LibDialog/build.gradle @@ -33,7 +33,7 @@ afterEvaluate { groupId = 'com.mx.dialog' artifactId = 'MXDialog' - version = '1.0.9' + version = rootProject.ext.versionName } } } @@ -41,4 +41,5 @@ afterEvaluate { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compileOnly 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' } \ No newline at end of file diff --git a/LibDialog/src/main/java/com/mx/dialog/MXDialog.kt b/LibDialog/src/main/java/com/mx/dialog/MXDialog.kt index 9ecb35c4ff788f460a69788a50f0de356d6b1cad..7bb7a80ab037b64b4d60501c2643395db420c043 100644 --- a/LibDialog/src/main/java/com/mx/dialog/MXDialog.kt +++ b/LibDialog/src/main/java/com/mx/dialog/MXDialog.kt @@ -8,6 +8,9 @@ import com.mx.dialog.tip.MXDialogType import com.mx.dialog.tip.MXTipDialog import com.mx.dialog.utils.IMXLifecycle import com.mx.dialog.utils.MXUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext object MXDialog { fun setDebug(debug: Boolean) { @@ -45,7 +48,7 @@ object MXDialog { cancelable: Boolean = true, maxContentRatio: Float = 1f, onActionClick: ((confirm: Boolean) -> Unit)? = null - ) { + ): MXTipDialog { val dialog = MXTipDialog(context) dialog.setTitle(title) dialog.setMessage(message) @@ -62,6 +65,36 @@ object MXDialog { } dialog.setTipType(MXDialogType.WARN) dialog.show() + return dialog + } + + suspend fun confirmSync( + context: Context, + message: CharSequence, + title: CharSequence? = null, + actionButtonText: CharSequence? = null, + cancelButtonText: CharSequence? = null, + cancelable: Boolean = true, + maxContentRatio: Float = 1f + ): Boolean = withContext(Dispatchers.Main) { + var hasConfirm = false + val lock = Object() + confirm( + context, + message, + title, + actionButtonText, + cancelButtonText, + cancelable, + maxContentRatio + ) { confirm -> + hasConfirm = confirm + synchronized(lock) { lock.notifyAll() } + } + return@withContext withContext(Dispatchers.IO) { + synchronized(lock) { lock.wait() } + hasConfirm ?: false + } } /** @@ -77,7 +110,7 @@ object MXDialog { context: Context, message: CharSequence, title: CharSequence? = null, actionButtonText: CharSequence? = null, maxContentRatio: Float = 1f, dismissDelay: Int? = null, dialogType: MXDialogType? = null - ) { + ): MXTipDialog { val dialog = MXTipDialog(context) dialog.setTitle(title) dialog.setMessage(message) @@ -92,6 +125,32 @@ object MXDialog { ) dialog.setTipType(dialogType) dialog.show() + return dialog + } + + suspend fun tipSync( + context: Context, message: CharSequence, title: CharSequence? = null, + actionButtonText: CharSequence? = null, maxContentRatio: Float = 1f, + dismissDelay: Int? = null, dialogType: MXDialogType? = null + ) = withContext(Dispatchers.Main) { + val lock = Object() + val dialog = tip( + context, + message, + title, + actionButtonText, + maxContentRatio, + dismissDelay, + dialogType + ) + dialog.setOnDismissListener { + synchronized(lock) { lock.notifyAll() } + } + dialog.show() + + return@withContext withContext(Dispatchers.IO) { + synchronized(lock) { lock.wait() } + } } fun select( @@ -103,28 +162,72 @@ object MXDialog { contentMaxHeightRatio: Float = 1f, contentRadiusDP: Float = 10f, contentMarginDP: Float = 20f, - position: MXDialogPosition = MXDialogPosition.BOTTOM, + position: MXDialogPosition = MXDialogPosition.CENTER, textColor: Int? = null, textSizeSP: Float? = null, textGravity: Int? = Gravity.LEFT or Gravity.CENTER_VERTICAL, + onCancelListener: (() -> Unit)? = null, select: ((index: Int) -> Unit) - ) { - MXListDialog(context).apply { - setTitle(title) - setContentMaxHeightRatio(contentMaxHeightRatio) - setContentCornerRadius(contentRadiusDP) - setContentPosition(position) - setContentMargin(contentMarginDP) - setCancelable(cancelable) - setItems( - list, - selectIndex = selectIndex, - textColor = textColor, - textSizeSP = textSizeSP, - textGravity = textGravity, - onSelect = select - ) - }.show() + ): MXListDialog { + val dialog = MXListDialog(context) + dialog.setTitle(title) + dialog.setContentMaxHeightRatio(contentMaxHeightRatio) + dialog.setContentCornerRadius(contentRadiusDP) + dialog.setContentPosition(position) + dialog.setContentMargin(contentMarginDP) + dialog.setCancelable(cancelable) + dialog.setOnCancelListener(onCancelListener) + dialog.setItems( + list, + selectIndex = selectIndex, + textColor = textColor, + textSizeSP = textSizeSP, + textGravity = textGravity, + onSelect = select + ) + dialog.show() + return dialog + } + + suspend fun selectSync( + context: Context, + list: List, + selectIndex: Int? = null, + title: CharSequence? = null, + cancelable: Boolean = true, + contentMaxHeightRatio: Float = 1f, + contentRadiusDP: Float = 10f, + contentMarginDP: Float = 20f, + position: MXDialogPosition = MXDialogPosition.CENTER, + textColor: Int? = null, + textSizeSP: Float? = null, + textGravity: Int? = Gravity.LEFT or Gravity.CENTER_VERTICAL + ): Int? = withContext(Dispatchers.Main) { + var checkedIndex: Int? = null + val lock = Object() + select( + context = context, + list = list, + selectIndex = selectIndex, + title = title, + cancelable = cancelable, + contentMaxHeightRatio = contentMaxHeightRatio, + contentRadiusDP = contentRadiusDP, + contentMarginDP = contentMarginDP, + position = position, + textColor = textColor, + textSizeSP = textSizeSP, + textGravity = textGravity, + onCancelListener = { synchronized(lock) { lock.notifyAll() } } + ) { index -> + checkedIndex = index + synchronized(lock) { lock.notifyAll() } + } + + return@withContext withContext(Dispatchers.IO) { + synchronized(lock) { lock.wait() } + checkedIndex + } } fun selectMulti( @@ -140,24 +243,67 @@ object MXDialog { textColor: Int? = null, textSizeSP: Float? = null, textGravity: Int? = Gravity.LEFT or Gravity.CENTER_VERTICAL, + onCancelListener: (() -> Unit)? = null, select: ((list: List) -> Unit) - ) { - MXListDialog(context).apply { - setTitle(title) - setContentMaxHeightRatio(contentMaxHeightRatio) - setContentCornerRadius(contentRadiusDP) - setContentPosition(position) - setContentMargin(contentMarginDP) - setCancelable(cancelable) - setMultipleItems( - list, - selectIndexList = selectIndexList, - textColor = textColor, - textSizeSP = textSizeSP, - textGravity = textGravity, - onSelect = select - ) - }.show() + ): MXListDialog { + val dialog = MXListDialog(context) + dialog.setTitle(title) + dialog.setContentMaxHeightRatio(contentMaxHeightRatio) + dialog.setContentCornerRadius(contentRadiusDP) + dialog.setContentPosition(position) + dialog.setContentMargin(contentMarginDP) + dialog.setCancelable(cancelable) + dialog.setOnCancelListener(onCancelListener) + dialog.setMultipleItems( + list, + selectIndexList = selectIndexList, + textColor = textColor, + textSizeSP = textSizeSP, + textGravity = textGravity, + onSelect = select + ) + dialog.show() + return dialog } + suspend fun selectMultiSync( + context: Context, + list: List, + selectIndexList: List? = null, + title: CharSequence? = null, + cancelable: Boolean = true, + contentMaxHeightRatio: Float = 1.2f, + contentRadiusDP: Float = 10f, + contentMarginDP: Float = 20f, + position: MXDialogPosition = MXDialogPosition.BOTTOM, + textColor: Int? = null, + textSizeSP: Float? = null, + textGravity: Int? = Gravity.LEFT or Gravity.CENTER_VERTICAL + ): List? = withContext(Dispatchers.Main) { + var checkedIndex: List? = null + val lock = Object() + selectMulti( + context = context, + list = list, + selectIndexList = selectIndexList, + title = title, + cancelable = cancelable, + contentMaxHeightRatio = contentMaxHeightRatio, + contentRadiusDP = contentRadiusDP, + contentMarginDP = contentMarginDP, + position = position, + textColor = textColor, + textSizeSP = textSizeSP, + textGravity = textGravity, + onCancelListener = { synchronized(lock) { lock.notifyAll() } } + ) { index -> + checkedIndex = index + synchronized(lock) { lock.notifyAll() } + } + + return@withContext withContext(Dispatchers.IO) { + synchronized(lock) { lock.wait() } + checkedIndex + } + } } \ No newline at end of file diff --git a/LibDialog/src/main/java/com/mx/dialog/list/MXBaseListDialog.kt b/LibDialog/src/main/java/com/mx/dialog/list/MXBaseListDialog.kt index 6b811e85c85b7904859aa054fa1a22e58089351a..f901fa2f768b9b2d0d6cc502260effbf65d62e78 100644 --- a/LibDialog/src/main/java/com/mx/dialog/list/MXBaseListDialog.kt +++ b/LibDialog/src/main/java/com/mx/dialog/list/MXBaseListDialog.kt @@ -69,7 +69,6 @@ open class MXBaseListDialog(context: Context) : MXBaseDialog(context) { protected open fun initDialog() { if (listView == null) return - if (titleStr != null) { titleTxv?.text = titleStr titleLay?.visibility = View.VISIBLE @@ -92,6 +91,11 @@ open class MXBaseListDialog(context: Context) : MXBaseDialog(context) { } else { btnDivider?.visibility = View.GONE } + if (cancelBtn?.visibility != View.VISIBLE && okBtn?.visibility != View.VISIBLE) { + btnLay?.visibility = View.GONE + } else { + btnLay?.visibility = View.VISIBLE + } } if (contentCornerRadiusDP >= 0) { @@ -277,8 +281,6 @@ open class MXBaseListDialog(context: Context) : MXBaseDialog(context) { protected fun setActionClick(click: (() -> Unit)? = null) { actionProp.onclick = click - - initDialog() } /** diff --git a/README.md b/README.md index a6a5d59735564f587e8bf92a48727a701bdbb5fb..8a6acd38fc652c76e47c8ad6ffed1ca199ebee56 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ ```groovy dependencies { + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' implementation 'com.gitee.zhangmengxiong:MXDialog:x.x.x' } ``` diff --git a/app/build.gradle b/app/build.gradle index a7471f5f4932c81961434cdb211d8985ab4d1921..e9c5e044dab427d32f528723b4bdd91cfc47b070 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,6 +34,10 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' + implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.4.0' diff --git a/app/src/main/java/com/mx/example/MainActivity.kt b/app/src/main/java/com/mx/example/MainActivity.kt index fe73b66262fa4bc5655b37ade24cc71997812c24..d385253ea6437c2332c56915900b8e98318f1694 100644 --- a/app/src/main/java/com/mx/example/MainActivity.kt +++ b/app/src/main/java/com/mx/example/MainActivity.kt @@ -10,12 +10,14 @@ import android.text.Html import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import com.gyf.immersionbar.BarHide import com.gyf.immersionbar.ImmersionBar import com.mx.dialog.MXDialog import com.mx.dialog.tip.MXDialogType import com.mx.dialog.upgrade.MXUpgradeDialog import com.mx.dialog.utils.IMXLifecycle +import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { protected val immersionBar: ImmersionBar by lazy { @@ -85,8 +87,12 @@ class MainActivity : AppCompatActivity() { } fun showConfirm(view: View) { - MXDialog.confirm(this, "请确认") { confirm -> - Toast.makeText(this@MainActivity, "操作回调 confirm=$confirm", Toast.LENGTH_SHORT).show() +// MXDialog.confirm(this, "请确认") { confirm -> +// Toast.makeText(this@MainActivity, "操作回调 confirm=$confirm", Toast.LENGTH_SHORT).show() +// } + lifecycleScope.launch { + val confirm = MXDialog.confirmSync(this@MainActivity, "请确认") + MXDialog.tip(this@MainActivity, "确认:$confirm") } } @@ -124,13 +130,14 @@ class MainActivity : AppCompatActivity() { } fun showSelect(view: View) { - MXDialog.select( - this, - list = ('A'..'Z').toMutableList().map { it.toString() }, - selectIndex = 0, -// cancelable = false - ) { index -> - MXDialog.confirm(this@MainActivity, "点击了:$index") + lifecycleScope.launch { + val index = MXDialog.selectMultiSync( + this@MainActivity, + list = ('A'..'Z').toMutableList().map { it.toString() }, + selectIndexList = arrayListOf(0, 1), +// cancelable = false + ) + MXDialog.tip(this@MainActivity, "点击了:$index") } } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 075920c5a0ce2ff4628dc507e2f961be31f3cf10..67b952d9f876eaba40505c69cf38ec90c505d991 100644 --- a/build.gradle +++ b/build.gradle @@ -34,5 +34,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.0.9" + versionName = "1.5.7" } \ No newline at end of file