LDialog基於DialogFragment封裝的庫,也許是一個Nice的庫

limuyang2發表於2019-02-23

先放上地址GitHub,歡迎star,也歡迎給我發issues

LDialog

一個基於Google推薦的DialogFragment封裝的的庫,根據自身業務提取封裝,本庫全部使用kotlin編寫,java亦可呼叫,能滿足大部分的專案需求,能在Activity與Fragment中使用。本專案準則即是遵守最大化的自由程度。

本庫目前已具備的特點如下:

  • 橫豎屏旋轉儲存Dialog屬性狀態(並且能保持DialogFragment的事件狀態,例如點選事件)
  • 完全的自定義介面
  • 豐富的介面屬性設定
  • 完美的鍵盤自動彈出(並非使用延遲的方法)

使用建議: DialogFragment相對於AlertDialog有很多優點。但對於只需要非常簡單資訊提示、僅需要原生樣式,以及不考慮橫豎屏的情況下,推薦使用更簡單的AlertDialog,請不要把簡單問題複雜化。DialogFragment適合用有UI要求、使用要求的情況下。

原始碼說明:
如果你還沒上手koltin,建議學習使用。本庫的環境版本如下:

  • kotlin 1.2.51
  • Android support 27.1.1

預覽

LDialog基於DialogFragment封裝的庫,也許是一個Nice的庫

由於錄屏的限制無法錄製橫豎切換情況。請下載demo體驗

demo下載地址

demo apk

獲取

本庫分為必須匯入的LDialog和非必須的CustomLDialog
LDialog為基礎庫;CustomLDialog中包含了自定義的樣式,不需要可以不匯入。
先在 build.gradle 的 repositories 新增:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}
複製程式碼

再在dependencies新增:

dependencies {
	//必須匯入
	implementation 'com.github.limuyang2.LDialog:ldialog:1.0'
	//3種自定義樣式,不使用就不匯入
	implementation 'com.github.limuyang2.LDialog:custom_ldialog:1.0'
}
複製程式碼

簡單使用

LDialog與CustonLDialog均繼承於BaseLDialog類。

init()中的引數,Activity中使用supportFragmentManagerFragment中使用childFragmentManager

CustonLDialog 使用方式

目前裡面包含3種自定義樣式:

  • IOSMsgDialog
  • MaterialMsgDialog
  • BottomTextListDialog

以下以MaterialMsgDialog為示例:

//koltin
MaterialMsgDialog.init(supportFragmentManager) //Freagment中使用childFragmentManager
	.setTitle("Material Style")
	.setMessage("This is Material Design dialog!")
	.setNegativeButton("Decline", View.OnClickListener {
		Toast.makeText(this@MainActivity, "Decline", Toast.LENGTH_SHORT).show()
    })
    .setPositiveButton("Accept", View.OnClickListener {
        Toast.makeText(this@MainActivity, "Accept", Toast.LENGTH_SHORT).show()
    })
    .show()
複製程式碼
//java
MaterialMsgDialog.Companion.init(getSupportFragmentManager())
	.setTitle("Material Style")
	.setMessage("This is Material Design dialog!")
	.setNegativeButton("Decline", new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			Toast.makeText(JavaDemo.this, "Decline", Toast.LENGTH_SHORT).show()
        }
    })
    .setPositiveButton("Accept", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(JavaDemo.this, "Accept", Toast.LENGTH_SHORT).show()
        }
    })
    .show();
複製程式碼

LDialog 使用方式 (主要使用方式)

用對外提供使用 layoutRes 自定義佈局。
示例如下:

//kotlin
LDialog.init(supportFragmentManager)
	.setLayoutRes(R.layout.ldialog_share)
	.setBackgroundDrawableRes(R.drawable.shape_share_dialog_bg)
	.setGravity(Gravity.BOTTOM)
	.setWidthScale(0.95f)
	.setVerticalMargin(0.015f)
	.setAnimStyle(R.style.LDialogBottomAnimation)
	.setViewHandlerListener(object : ViewHandlerListener() {
		override fun convertView(holder: ViewHolder, dialog: BaseLDialog<*>) {
        	holder.setOnClickListener(R.id.cancelBtn, View.OnClickListener {
            	dialog.dismiss()
            })
       }
    })
    .show()
複製程式碼

Java使用請參考專案下的 JavaDemo.java

方法說明

方法名 說明
setLayoutRes 設定佈局資源【優先順序高於setLayoutView】【僅LDialog,必須】
setLayoutView 設定佈局view(不推薦使用)【僅LDialog,必須】
* setViewHandlerListener (重要)設定佈局中控制元件的屬性。如果【需要】考慮橫豎屏旋轉,則控制元件的相關屬性必須在此設定。建議對佈局中控制元件的設定均寫在此處。【僅LDialog,必須】
通用方法(BaseLDialog)
setBackgroundDrawableRes 彈窗背景資原始檔id
setTag DialogFragment的標籤
setDismissListener 彈窗的關閉監聽
setGravity 窗體位置(例:Gravity.CENTER Gravity.TOP)
setWidthScale 佔螢幕寬度的比例(範圍0.0 - 1.0,當為1.0時即為鋪滿)【優先順序高於setWidthDp】
setWidthDp Dialog的寬度,單位dp
setHeightScale 佔螢幕高度的比例(範圍0.0 - 1.0)【優先順序高於setHeightDp】
setHeightDp Dialog的高度,單位dp
setKeepWidthScale 橫屏時,是否保持設定的寬度比例【僅當設定了寬度比例setWidthScale後,才生效】(預設false)
setKeepHeightScale 橫屏時,是否保持設定的高度比例【僅當設定了高度比例setHeightScale後,才生效】(預設false)
setVerticalMargin 設定垂直方向的Margin值(範圍0.0 - 0.1)
setCancelableAll 設定是否可以點選dialog外及返回鍵關閉dialog
setCancelableOutside 設定是否可以點選dialog外關閉dialog(返回鍵不受影響)
setAnimStyle 動畫Style資原始檔id
setNeedKeyboardEditTextId 設定需要自動彈出鍵盤的控制元件id,必須是EditText型別的控制元件
show 顯示Dialog

高階使用

如果以上仍然無法滿足你們的需求,那可以直接繼承BaseLDialog類,同時也就具備了通用方法。具體可參考CustonLDialog中的三個彈窗類。
基本寫法如下:

class ExKotlinLdialog : BaseLDialog<ExKotlinLdialog>() {

    override fun layoutRes(): Int = R.layout.ldialog_share

    override fun layoutView(): View? = null

    /**
     * 必須
     * 如果【需要】考慮橫豎屏旋轉,則控制元件的相關屬性在此設定
     * @return
     */
    override fun viewHandler(): ViewHandlerListener? {
        return object : ViewHandlerListener() {
            override fun convertView(holder: ViewHolder, dialog: BaseLDialog<*>) {
                
            }
        }
    }

    /**
     * 可選
     * 如果【不】考慮橫豎屏旋轉,也可以在此設定控制元件屬性
     * @param view
     */
    override fun initView(view: View) {

    }
}
複製程式碼

Java使用請參考專案下的 ExJavaLdialog.java

License

2018 limuyang
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
複製程式碼

相關文章