모서리가 둥근 사용자 지정 대화 상자의 kotlin 버전에 대한 자세한 설명

먼저 다음과 같이 렌더링을 살펴보십시오.

여기에 사진 설명 삽입

포인트

여기에 사진 설명 삽입

1. 배경 소개

해외 진열대에서 작은 패키지에 대한 수요가 발생했으며 효과 다이어그램은 위에 나와 있습니다. 사실 이것은 또한 간단한 대화 상자입니다. 단지 작은 요구 사항 일뿐입니다.

1. 둥근 모서리가 있습니다
. 2. 배경 이미지는 동적으로 교체 될 수 있습니다.
3. 텍스트는 동적으로 교체 될 수 있습니다
. 4. 버튼 둥근 모서리, 텍스트 동적 교체, 배경색이 동적으로 교체됩니다.

나는 도둑에게 모든 패킷이이 대화 상자를 사용해야한다고 생각하면서 단순 해지라고 요청했습니다. 그래서 아이디어가 떠 올랐습니다. 얼마 전에 kt를 배웠고보기를 사용자 정의했습니다. 또한 타사 라이브러리를 사용하는 것처럼 직접 aar를 만들 수 있는지 궁금했습니다. 앞으로 벽돌을 옮기는 것이 행복하지 않을까요? 신입생으로서 당신은 더 많은 일을하고, 더 많이 생각하고, 잘해야합니다! 여기에 간단한 것이 있습니다. 초점은 이득을 요약하는 것입니다. . .

둘째, 사용자 지정 대화 상자의 세부 단계

1. 아이디어

사용자 지정 뷰에 대해 아는 사람은 새로운 뷰를 사용자 지정하는 것이 때때로 더 복잡하다는 것을 알고 있으며, wrap_content 처리, 뷰에 패딩 추가 등과 같이 많은 뷰를 처리해야합니다. 다행히도 사용자 지정 대화 상자는 비교적 간단합니다. 원래보기에서 확장하기 만하면됩니다.

(1) 대화를 상속 할 클래스 생성

(2) 레이아웃로드

(3) 스타일 추가

(4) 인터페이스 노출

2. 간단한 구현

(1) 대화를 상속 할 클래스 생성

이것에 대해 할 말이별로 없습니다. 세 번 나왔습니다. . .

/**
 * Created by sunnyDay on 2019/8/22 19:33
 */
class SubscriptionDialog : Dialog {
    
    
}

(2) 레이아웃로드

레이아웃을로드하는 것은 실제로 xml 레이아웃 파일을보기로 변환 한 다음 표시하는 것입니다.
두 가지 일반적인 방법이 있습니다.
1. View의 inflate 메소드
2. LayoutInflater의 inflate 메소드 (대화 상자를 사용자 정의 할 때 피트가
있음) 실제로 대화 상자 클래스에서 제공하는 setContentView 메소드도 뷰로 변환 된 레이아웃입니다 (대화 상자를 사용자 정의 할 때 피트가 있습니다).

(3) 스타일 추가

스타일은 활동의 주제와 유사합니다. 대화를 아름답게합니다. . .


    <!--自定义对话框的样式-->
    <style name="SubscriptionDialog" parent="@style/AlertDialog.AppCompat">
        <!--边框-->
        <item name="android:windowFrame">@null</item>
        <!--是否浮现在activity之上-->
        <item name="android:windowIsFloating">true</item>
        <!--半透明-->
        <item name="android:windowIsTranslucent">false</item>
        <!--无标题-->
        <item name="android:windowNoTitle">true</item>
        <!--提示框背景-->
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

(4) 인터페이스 노출

대화 버튼 이벤트, 제목 내용 수정과 같은 몇 가지 방법 만 제공하면됩니다. . .

(5) 소스 코드

/**
 * Created by sunnyDay on 2019/8/22 19:33
 */
class SubscriptionDialog : Dialog {
    
    

    private var mOnContinueClickListener: OnContinueClickListener? = null

    /**
     *  use default dialog style
     * */
    constructor(context: Context) : super(context, R.style.SubscriptionDialog) {
    
    
        setContentView(R.layout.dialog_simple)
    }

    /**
     *  user give a custom dialog style
     * */
    constructor(context: Context, dialogStyle: Int) : super(context, dialogStyle) {
    
    
        setContentView(R.layout.dialog_simple)
    }

    /**
     * set image of dialog
     * */
    fun setImage(img: Int): SubscriptionDialog {
    
    
//        when (img) {
    
    
//            img is Int -> iv_img.setImageResource(img as Int)
//            img is Drawable -> iv_img.setImageDrawable(img as Drawable)
//            img is Bitmap -> iv_img.setImageBitmap(img as Bitmap)
//        }
        iv_img.setImageResource(img)
        return this
    }

    /**
     * set the content of dialog
     * */
    fun setContentText(content: String): SubscriptionDialog {
    
    
        tv_content.text = content
        return this
    }

    /**
     * set the content of dialog
     * */
    fun setContentTextColor(contextTextColor: Int): SubscriptionDialog {
    
    
        tv_content.setTextColor(contextTextColor)
        return this
    }

    /**
     * set text of button
     * */
    fun setButtonText(btnText: CharSequence): SubscriptionDialog {
    
    
        bt_button.text = btnText
        return this
    }

    /**
     * set color of button text
     * */
    fun setButtonTextColor(textColor: Int): SubscriptionDialog {
    
    
        bt_button.setTextColor(textColor)
        return this
    }

    /**
     * set color of button bg
     * */
    fun setButtonBackgroundColor(btnBgColor: Int): SubscriptionDialog {
    
    
        bt_button.setBackgroundColor(btnBgColor)
        return this
    }

    /**
     * onClickListener of dialog
     * */
    fun setOnContinueClickListener(onContinueClickListener: OnContinueClickListener?): SubscriptionDialog {
    
    
        mOnContinueClickListener = onContinueClickListener
        onButtonClick()
        return this
    }

    /**
     * show dialog
     * */
    fun showDialog() {
    
    
        this.show()
    }

    /**
     * close dialog
     * */
    fun dismissDialog() {
    
    
        this.dismiss()
    }

    private fun onButtonClick() {
    
    
        bt_button.setOnClickListener {
    
    
            mOnContinueClickListener?.onClick()
                ?: throw Exception("onContinueClickListener is null,please give a non-value.")
        }
    }

    interface OnContinueClickListener {
    
    
        fun onClick()
    }
}

세, aar로 패키지

1. 이해

1. 사실 우리 프로젝트는 안드로이드 프로젝트, 안드로이드 라이브러리, 자바 라이브러리로 나뉩니다.
2. 왜 aar를 포장합니까? jar 패키지와의 차이점 :

jar 패키지의 내부 단계에는 클래스 파일과 매니페스트 파일 만 포함되며
aar 파일에는 클래스 및 res 리소스 파일을 포함한 모든 리소스 파일이 포함됩니다. res
파일 을 사용하는 것이 편리 합니다.

2. 포장

(1) Android 라이브러리는 다음과 같이 직접 작동합니다.

여기에 사진 설명 삽입

(2) Android 프로젝트

위와 같이 Android 라이브러리 및 패키지가되어야합니다.

단계 변경

쓸모없는 코드 제거 :
1. 매니페스트는 응용 프로그램 노드와 해당 속성 만 유지합니다.
2. App.build는 다음과 같이 제거됩니다.

여기에 사진 설명 삽입

그런 다음 포장

여기에 사진 설명 삽입

3. 사용

(1) aar 패키지를 프로젝트의 lib에 복사하십시오.

(2) kotlin 지원 및 aar 소개 추가 (대화 상자는 kotlin에 포함되어 있음)

//1、工程的build.grdle添加:

buildscript {
    
    
    ext.kotlin_version = '1.3.21' // kt 版本
    repositories {
    
    
        google()
        jcenter()
        
    }
    dependencies {
    
    
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"//kt插件
       
    }
}

// 2、项目的build.gradle 添加:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

// 3、引入aar:

 repositories {
    
    
   flatDir {
    
    
     dirs 'libs' 
   }

 }

 dependencies {
    
    

   implementation(name: 'SubscriptionDialog_1.0.1', ext: 'aar') //必须引入
   implementation 'com.android.support:design:28.0.0'//必须引入,自定义dialog有使用
 }

4. 사용이 간편
  val dialog = SubscriptionDialog(this)
        dialog
            .setImage(R.drawable.peiqi)//背景图
            .setContentText("hello custom dialog 、hello custom dialog 、hello custom dialog ")//内容
            .setContentTextColor(Color.RED)//内容的字体颜色
            .setButtonText("sunny")//按钮字体
            .setButtonTextColor(Color.BLACK) // 按钮字体颜色
            .setButtonBackgroundColor(Color.parseColor("#FFD81B60"))
            .setOnContinueClickListener(object : SubscriptionDialog.OnContinueClickListener {
    
    
                override fun onClick() {
    
    
                    Toast.makeText(applicationContext, "simple dialog", Toast.LENGTH_LONG).show()
                    dialog.dismissDialog()
                }
            })
            .showDialog()

구덩이 밟기 요약

1. 대화 상자 크기 오류 문제

LayoutInflate를 사용하면 확장 설정 대화 상자 크기가 유효하지 않습니다.

2. 필렛 설정

모양과 카드 뷰의 선택 모양을 사용할
때 대화 상자의 배경이 바뀔 때 둥근 모서리가 무효가되므로 카드 뷰를 레이아웃으로 사용할 수 있습니다. 대화의 스타일을 거의 변경할 필요가 없으면 모양을 사용할 수 있습니다.

3 、 NoClassDefFoundError

이 기사에서 Java 프로젝트를 만나면 kotlin 환경 참조 기사를 소개하지 않을 수 있습니다.

종료

aar 다운로드

추천

출처blog.csdn.net/qq_38350635/article/details/100052362