├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── bwq │ │ └── paydialogdemo │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── bwq │ │ │ └── paydialogdemo │ │ │ ├── MainActivity.java │ │ │ └── PayDialog.java │ └── res │ │ ├── anim │ │ ├── actionsheet_dialog_in.xml │ │ └── actionsheet_dialog_out.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── alipay.png │ │ ├── balance.png │ │ ├── btn_bg.xml │ │ ├── ic_launcher_background.xml │ │ └── wechat.png │ │ ├── layout │ │ ├── activity_main.xml │ │ └── pay_dialog_layout.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── bwq │ └── paydialogdemo │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nibamao/PayDialogDemo/df69ee7413b44e0534915ed0dbbace901c365747/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PayDialogDemo 2 | 支付方式选择弹窗 3 | 支持微信、支付宝、余额三种支付方式的选择,也可只支持微信支付包两种支付方式的选择 4 | 采用链式调用 5 | [我的简书](https://www.jianshu.com/p/5dbd3e79ef79) 6 | ![](https://upload-images.jianshu.io/upload_images/8145634-e0bcbbd8b57c75d7.png) 7 | ![](https://upload-images.jianshu.io/upload_images/8145634-4fbb79af3718f5c6.png) 8 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.example.bwq.paydialogdemo" 7 | minSdkVersion 15 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | } 29 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/bwq/paydialogdemo/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.bwq.paydialogdemo; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.bwq.paydialogdemo", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bwq/paydialogdemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bwq.paydialogdemo; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | import android.widget.Toast; 8 | 9 | public class MainActivity extends AppCompatActivity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_main); 15 | TextView tv = findViewById(R.id.pay); 16 | tv.setOnClickListener(new View.OnClickListener() { 17 | @Override 18 | public void onClick(View view) { 19 | new PayDialog(MainActivity.this) 20 | .setData(20, 30) 21 | .haveWXPay(false) 22 | .haveAliPay(true) 23 | .haveBalance(true) 24 | .setListener(new PayDialog.OnPayClickListener() { 25 | @Override 26 | public void onPayClick(int payType) { 27 | switch (payType) { 28 | case PayDialog.ALI_PAY: 29 | Toast.makeText(MainActivity.this, "支付宝", Toast.LENGTH_LONG).show(); 30 | break; 31 | case PayDialog.WX_PAY: 32 | Toast.makeText(MainActivity.this, "微信", Toast.LENGTH_LONG).show(); 33 | break; 34 | case PayDialog.BALANCE_PAY: 35 | Toast.makeText(MainActivity.this, "余额", Toast.LENGTH_LONG).show(); 36 | break; 37 | } 38 | } 39 | }).show(); 40 | } 41 | }); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bwq/paydialogdemo/PayDialog.java: -------------------------------------------------------------------------------- 1 | package com.example.bwq.paydialogdemo; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.os.Bundle; 6 | import android.support.annotation.NonNull; 7 | import android.view.Gravity; 8 | import android.view.View; 9 | import android.view.WindowManager; 10 | import android.widget.Button; 11 | import android.widget.ImageView; 12 | import android.widget.RadioButton; 13 | import android.widget.RelativeLayout; 14 | import android.widget.TextView; 15 | 16 | 17 | public class PayDialog extends Dialog implements View.OnClickListener { 18 | 19 | private Context context; 20 | 21 | public static final int WX_PAY = 0; 22 | public static final int ALI_PAY = 1; 23 | public static final int BALANCE_PAY = 2; 24 | 25 | 26 | private TextView tvCancel; 27 | private TextView tvPayMoney; 28 | private RadioButton rbWxPay; 29 | private RelativeLayout rlWxPay; 30 | private RadioButton rbAliPay; 31 | private RelativeLayout rlAliPay; 32 | private ImageView ivBalanceIcon; 33 | private TextView tvBalancePay; 34 | private TextView tvBalancePayContext; 35 | private TextView tvBalance; 36 | private RadioButton rbBalancePay; 37 | private RelativeLayout rlBalancePay; 38 | private Button btnPay; 39 | 40 | private int payType = 0;//支付方式,默认微信 41 | private OnPayClickListener listener; 42 | private double payMoney = 0;//支付金额 43 | private double balance = 0;//余额 44 | 45 | private Boolean haveBalance = true; 46 | private Boolean haveAliPay = true; 47 | private Boolean haveWXPay = true; 48 | 49 | public PayDialog setListener(OnPayClickListener listener) { 50 | this.listener = listener; 51 | return this; 52 | } 53 | 54 | public PayDialog(@NonNull Context context) { 55 | super(context, R.style.ActionSheetDialogStyle); 56 | this.context = context; 57 | } 58 | 59 | public PayDialog haveBalance(Boolean haveBalance) { 60 | this.haveBalance = haveBalance; 61 | return this; 62 | } 63 | 64 | public PayDialog haveAliPay(Boolean haveAliPay) { 65 | this.haveAliPay = haveAliPay; 66 | return this; 67 | } 68 | 69 | public PayDialog haveWXPay(Boolean haveWXPay) { 70 | this.haveWXPay = haveWXPay; 71 | return this; 72 | } 73 | 74 | /** 75 | * @param payMoney 支付金额 76 | * @param balance 余额 77 | * @return 78 | */ 79 | public PayDialog setData(double payMoney, double balance) { 80 | this.payMoney = payMoney; 81 | this.balance = balance; 82 | return this; 83 | } 84 | 85 | @Override 86 | protected void onCreate(Bundle savedInstanceState) { 87 | super.onCreate(savedInstanceState); 88 | setContentView(R.layout.pay_dialog_layout); 89 | tvCancel = findViewById(R.id.tv_cancel); 90 | tvPayMoney = findViewById(R.id.tv_pay_money); 91 | rbWxPay = findViewById(R.id.rb_wx_pay); 92 | rbAliPay = findViewById(R.id.rb_ali_pay); 93 | ivBalanceIcon = findViewById(R.id.iv_balance_icon); 94 | tvBalancePay = findViewById(R.id.tv_balance); 95 | tvBalancePayContext = findViewById(R.id.tv_balance_pay_context); 96 | tvBalance = findViewById(R.id.tv_balance); 97 | rbBalancePay = findViewById(R.id.rb_balance_pay); 98 | rlBalancePay = findViewById(R.id.rl_balance_pay); 99 | btnPay = findViewById(R.id.btn_pay); 100 | rlWxPay = findViewById(R.id.rl_wx_pay); 101 | rlAliPay = findViewById(R.id.rl_ali_pay); 102 | rlWxPay.setOnClickListener(this); 103 | rlAliPay.setOnClickListener(this); 104 | rlBalancePay.setOnClickListener(this); 105 | btnPay.setOnClickListener(this); 106 | tvCancel.setOnClickListener(this); 107 | java.text.DecimalFormat format = new java.text.DecimalFormat("0.00"); 108 | String payMoneyStr = format.format(payMoney); 109 | String balanceStr = format.format(balance); 110 | tvPayMoney.setText(payMoneyStr); 111 | tvBalance.setText(balanceStr); 112 | if (balance < payMoney) { 113 | tvBalance.setText(""); 114 | tvBalancePay.setTextColor(context.getResources().getColor(R.color.colorTextHint)); 115 | tvBalancePayContext.setTextColor(context.getResources().getColor(R.color.colorTextHint)); 116 | tvBalancePayContext.setText(context.getResources().getString(R.string.common_balance_not_enough_context)); 117 | ivBalanceIcon.setBackgroundColor(context.getResources().getColor(R.color.colorTextHint)); 118 | rlBalancePay.setClickable(false); 119 | rbBalancePay.setEnabled(false); 120 | } 121 | if (!haveWXPay) { 122 | rlWxPay.setVisibility(View.GONE); 123 | rbWxPay.setChecked(false); 124 | rbAliPay.setChecked(true); 125 | rbBalancePay.setChecked(false); 126 | } 127 | if (!haveAliPay) { 128 | rlAliPay.setVisibility(View.GONE); 129 | if (rlWxPay.getVisibility() == View.VISIBLE) { 130 | rbWxPay.setChecked(true); 131 | rbAliPay.setChecked(false); 132 | rbBalancePay.setChecked(false); 133 | } else { 134 | rbWxPay.setChecked(false); 135 | rbAliPay.setChecked(false); 136 | rbBalancePay.setChecked(true); 137 | } 138 | } 139 | if (!haveBalance) { 140 | rlBalancePay.setVisibility(View.GONE); 141 | if (rlWxPay.getVisibility() == View.VISIBLE && rlAliPay.getVisibility() == View.VISIBLE) { 142 | rbWxPay.setChecked(true); 143 | rbAliPay.setChecked(false); 144 | rbBalancePay.setChecked(false); 145 | } else if (rlAliPay.getVisibility() == View.VISIBLE && rlWxPay.getVisibility() == View.GONE) { 146 | rbWxPay.setChecked(false); 147 | rbAliPay.setChecked(true); 148 | rbBalancePay.setChecked(false); 149 | } 150 | } 151 | } 152 | 153 | @Override 154 | public void show() { 155 | super.show(); 156 | /** 157 | * 设置宽度全屏,要设置在show的后面 158 | */ 159 | if (getWindow() != null) { 160 | WindowManager.LayoutParams params = getWindow().getAttributes(); 161 | params.width = WindowManager.LayoutParams.MATCH_PARENT; 162 | params.height = WindowManager.LayoutParams.WRAP_CONTENT; 163 | getWindow().setAttributes(params); 164 | getWindow().setGravity(Gravity.BOTTOM); 165 | setCanceledOnTouchOutside(true); 166 | } 167 | if (!haveWXPay&&!haveAliPay&&!haveBalance){ 168 | dismiss(); 169 | } 170 | } 171 | 172 | @Override 173 | public void onClick(View v) { 174 | if (v.getId() == R.id.rl_wx_pay) { 175 | rbWxPay.setChecked(true); 176 | rbAliPay.setChecked(false); 177 | rbBalancePay.setChecked(false); 178 | payType = WX_PAY; 179 | } 180 | if (v.getId() == R.id.rl_ali_pay) { 181 | rbWxPay.setChecked(false); 182 | rbAliPay.setChecked(true); 183 | rbBalancePay.setChecked(false); 184 | payType = ALI_PAY; 185 | } 186 | if (v.getId() == R.id.rl_balance_pay) { 187 | rbWxPay.setChecked(false); 188 | rbAliPay.setChecked(false); 189 | rbBalancePay.setChecked(true); 190 | payType = BALANCE_PAY; 191 | } 192 | if (v.getId() == R.id.btn_pay) { 193 | listener.onPayClick(payType); 194 | dismiss(); 195 | } 196 | if (v.getId() == R.id.tv_cancel) { 197 | dismiss(); 198 | } 199 | } 200 | 201 | public interface OnPayClickListener { 202 | void onPayClick(int payType); 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /app/src/main/res/anim/actionsheet_dialog_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/actionsheet_dialog_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/alipay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nibamao/PayDialogDemo/df69ee7413b44e0534915ed0dbbace901c365747/app/src/main/res/drawable/alipay.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/balance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nibamao/PayDialogDemo/df69ee7413b44e0534915ed0dbbace901c365747/app/src/main/res/drawable/balance.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nibamao/PayDialogDemo/df69ee7413b44e0534915ed0dbbace901c365747/app/src/main/res/drawable/wechat.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pay_dialog_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 20 | 21 | 29 | 30 | 31 | 35 | 36 | 40 | 41 | 47 | 48 | 51 | 52 | 60 | 61 | 68 | 69 | 70 | 77 | 78 | 79 | 80 | 86 | 87 | 94 | 95 | 101 | 102 | 108 | 109 | 115 | 116 | 122 | 123 | 124 | 131 | 132 | 133 | 134 | 140 | 141 | 148 | 149 | 155 | 156 | 162 | 163 | 169 | 170 | 176 | 177 | 178 | 185 | 186 | 187 | 188 | 194 | 195 | 202 | 203 | 209 | 210 | 216 | 217 | 224 | 225 | 228 | 229 | 236 | 237 | 244 | 245 | 246 | 247 | 248 | 255 | 256 | 257 | 258 |