MainActivity.java 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447
  1. package com.kongzue.dialogxdemo.activity;
  2. import static com.kongzue.dialogx.dialogs.PopTip.tip;
  3. import android.animation.ValueAnimator;
  4. import android.content.ActivityNotFoundException;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.SharedPreferences;
  8. import android.content.res.Configuration;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.graphics.Color;
  12. import android.net.Uri;
  13. import android.os.Build;
  14. import android.os.Handler;
  15. import android.os.Looper;
  16. import android.provider.Settings;
  17. import android.text.Editable;
  18. import android.text.TextWatcher;
  19. import android.view.Gravity;
  20. import android.view.MotionEvent;
  21. import android.view.View;
  22. import android.view.ViewGroup;
  23. import android.view.WindowInsets;
  24. import android.view.WindowManager;
  25. import android.view.animation.Animation;
  26. import android.view.animation.AnimationUtils;
  27. import android.view.animation.DecelerateInterpolator;
  28. import android.view.inputmethod.InputMethodManager;
  29. import android.webkit.WebSettings;
  30. import android.webkit.WebView;
  31. import android.webkit.WebViewClient;
  32. import android.widget.AdapterView;
  33. import android.widget.EditText;
  34. import android.widget.ImageView;
  35. import android.widget.LinearLayout;
  36. import android.widget.RadioButton;
  37. import android.widget.RadioGroup;
  38. import android.widget.RelativeLayout;
  39. import android.widget.TextView;
  40. import android.widget.Toast;
  41. import androidx.annotation.NonNull;
  42. import androidx.constraintlayout.widget.ConstraintLayout;
  43. import androidx.recyclerview.widget.LinearLayoutManager;
  44. import androidx.recyclerview.widget.RecyclerView;
  45. import com.google.android.material.button.MaterialButton;
  46. import com.google.android.material.button.MaterialButtonToggleGroup;
  47. import com.kongzue.baseframework.BaseActivity;
  48. import com.kongzue.baseframework.BaseApp;
  49. import com.kongzue.baseframework.interfaces.DarkNavigationBarTheme;
  50. import com.kongzue.baseframework.interfaces.DarkStatusBarTheme;
  51. import com.kongzue.baseframework.interfaces.Layout;
  52. import com.kongzue.baseframework.interfaces.NavigationBarBackgroundColorRes;
  53. import com.kongzue.baseframework.util.CycleRunner;
  54. import com.kongzue.baseframework.util.JumpParameter;
  55. import com.kongzue.dialogx.DialogX;
  56. import com.kongzue.dialogx.dialogs.BottomDialog;
  57. import com.kongzue.dialogx.dialogs.BottomMenu;
  58. import com.kongzue.dialogx.dialogs.CustomDialog;
  59. import com.kongzue.dialogx.dialogs.FullScreenDialog;
  60. import com.kongzue.dialogx.dialogs.GuideDialog;
  61. import com.kongzue.dialogx.dialogs.InputDialog;
  62. import com.kongzue.dialogx.dialogs.MessageDialog;
  63. import com.kongzue.dialogx.dialogs.PopMenu;
  64. import com.kongzue.dialogx.dialogs.PopNotification;
  65. import com.kongzue.dialogx.dialogs.PopTip;
  66. import com.kongzue.dialogx.dialogs.TipDialog;
  67. import com.kongzue.dialogx.dialogs.WaitDialog;
  68. import com.kongzue.dialogx.interfaces.BaseDialog;
  69. import com.kongzue.dialogx.interfaces.BottomDialogSlideEventLifecycleCallback;
  70. import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
  71. import com.kongzue.dialogx.interfaces.DialogXAnimInterface;
  72. import com.kongzue.dialogx.interfaces.DialogXStyle;
  73. import com.kongzue.dialogx.interfaces.MenuItemTextInfoInterceptor;
  74. import com.kongzue.dialogx.interfaces.OnBackPressedListener;
  75. import com.kongzue.dialogx.interfaces.OnBackgroundMaskClickListener;
  76. import com.kongzue.dialogx.interfaces.OnBindView;
  77. import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
  78. import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
  79. import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
  80. import com.kongzue.dialogx.interfaces.OnMenuItemClickListener;
  81. import com.kongzue.dialogx.interfaces.OnMenuItemSelectListener;
  82. import com.kongzue.dialogx.style.IOSStyle;
  83. import com.kongzue.dialogx.style.KongzueStyle;
  84. import com.kongzue.dialogx.style.MIUIStyle;
  85. import com.kongzue.dialogx.style.MaterialStyle;
  86. import com.kongzue.dialogx.util.InputInfo;
  87. import com.kongzue.dialogx.util.ObjectRunnable;
  88. import com.kongzue.dialogx.util.TextInfo;
  89. import com.kongzue.dialogx.util.views.ActivityScreenShotImageView;
  90. import com.kongzue.dialogxdemo.App;
  91. import com.kongzue.dialogxdemo.BuildConfig;
  92. import com.kongzue.dialogxdemo.R;
  93. import com.kongzue.dialogxdemo.custom.recycleview.CustomRecycleViewAdapter;
  94. import com.kongzue.dialogxdemo.fragment.CustomFragment;
  95. import com.kongzue.dialogxmaterialyou.style.MaterialYouStyle;
  96. import java.util.ArrayList;
  97. import java.util.List;
  98. import java.util.Random;
  99. @Layout(R.layout.activity_main)
  100. @DarkStatusBarTheme(true)
  101. @DarkNavigationBarTheme(true)
  102. @NavigationBarBackgroundColorRes(R.color.emptyNavBar)
  103. public class MainActivity extends BaseActivity {
  104. private ConstraintLayout boxTitle;
  105. private TextView txtTitle;
  106. private ImageView btnShare;
  107. private ImageView splitBody;
  108. private LinearLayout boxBody;
  109. private MaterialButtonToggleGroup grpStyle;
  110. private MaterialButton rdoMaterial;
  111. private MaterialButton rdoIos;
  112. private MaterialButton rdoKongzue;
  113. private MaterialButton rdoMiui;
  114. private MaterialButton rdoMaterialYou;
  115. private MaterialButtonToggleGroup grpTheme;
  116. private MaterialButton rdoAuto;
  117. private MaterialButton rdoLight;
  118. private MaterialButton rdoDark;
  119. private MaterialButtonToggleGroup grpMode;
  120. private MaterialButton rdoModeView;
  121. private MaterialButton rdoModeWindow;
  122. private MaterialButton rdoModeDialogFragment;
  123. private MaterialButton rdoModeFloatingActivity;
  124. private MaterialButton btnMessageDialog;
  125. private MaterialButton btnSelectDialog;
  126. private MaterialButton btnInputDialog;
  127. private MaterialButton btnWaitDialog;
  128. private MaterialButton btnWaitAndTipDialog;
  129. private MaterialButton btnTipSuccess;
  130. private MaterialButton btnTipWarning;
  131. private MaterialButton btnTipError;
  132. private MaterialButton btnTipProgress;
  133. private MaterialButton btnPoptip;
  134. private MaterialButton btnPoptipBigMessage;
  135. private MaterialButton btnPoptipSuccess;
  136. private MaterialButton btnPoptipWarning;
  137. private MaterialButton btnPoptipError;
  138. private MaterialButton btnPopnotification;
  139. private MaterialButton btnPopnotificationBigMessage;
  140. private MaterialButton btnPopnotificationOverlay;
  141. private MaterialButton btnBottomDialog;
  142. private MaterialButton btnBottomMenu;
  143. private MaterialButton btnBottomReply;
  144. private MaterialButton btnBottomSelectMenu;
  145. private MaterialButton btnBottomMultiSelectMenu;
  146. private MaterialButton btnBottomCustomRecycleView;
  147. private MaterialButton btnCustomMessageDialog;
  148. private MaterialButton btnCustomInputDialog;
  149. private MaterialButton btnCustomBottomMenu;
  150. private MaterialButton btnCustomDialog;
  151. private MaterialButton btnCustomDialogAlign;
  152. private MaterialButton btnFullScreenDialogWebPage;
  153. private MaterialButton btnFullScreenDialogLogin;
  154. private MaterialButton btnFullScreenDialogFragment;
  155. private MaterialButton btnContextMenu;
  156. private TextView btnSelectMenu;
  157. private MaterialButton btnShowGuide;
  158. private MaterialButton btnShowGuideBaseView;
  159. private MaterialButton btnShowGuideBaseViewRectangle;
  160. private MaterialButton btnShowBreak;
  161. private MaterialButton btnListDialog;
  162. private TextView txtVer;
  163. @Override
  164. public void initViews() {
  165. boxTitle = findViewById(R.id.box_title);
  166. txtTitle = findViewById(R.id.txt_title);
  167. btnShare = findViewById(R.id.btn_share);
  168. splitBody = findViewById(R.id.split_body);
  169. boxBody = findViewById(R.id.box_body);
  170. grpStyle = findViewById(R.id.grp_style);
  171. rdoMaterial = findViewById(R.id.rdo_material);
  172. rdoIos = findViewById(R.id.rdo_ios);
  173. rdoKongzue = findViewById(R.id.rdo_kongzue);
  174. rdoMiui = findViewById(R.id.rdo_miui);
  175. rdoMaterialYou = findViewById(R.id.rdo_material_you);
  176. grpTheme = findViewById(R.id.grp_theme);
  177. rdoAuto = findViewById(R.id.rdo_auto);
  178. rdoLight = findViewById(R.id.rdo_light);
  179. rdoDark = findViewById(R.id.rdo_dark);
  180. grpMode = findViewById(R.id.grp_mode);
  181. rdoModeView = findViewById(R.id.rdo_mode_view);
  182. rdoModeWindow = findViewById(R.id.rdo_mode_window);
  183. rdoModeDialogFragment = findViewById(R.id.rdo_mode_dialogFragment);
  184. rdoModeFloatingActivity = findViewById(R.id.rdo_mode_floatingActivity);
  185. btnMessageDialog = findViewById(R.id.btn_messageDialog);
  186. btnSelectDialog = findViewById(R.id.btn_selectDialog);
  187. btnInputDialog = findViewById(R.id.btn_inputDialog);
  188. btnWaitDialog = findViewById(R.id.btn_waitDialog);
  189. btnWaitAndTipDialog = findViewById(R.id.btn_waitAndTipDialog);
  190. btnTipSuccess = findViewById(R.id.btn_tipSuccess);
  191. btnTipWarning = findViewById(R.id.btn_tipWarning);
  192. btnTipError = findViewById(R.id.btn_tipError);
  193. btnTipProgress = findViewById(R.id.btn_tipProgress);
  194. btnPoptip = findViewById(R.id.btn_poptip);
  195. btnPoptipBigMessage = findViewById(R.id.btn_poptip_bigMessage);
  196. btnPoptipSuccess = findViewById(R.id.btn_poptip_success);
  197. btnPoptipWarning = findViewById(R.id.btn_poptip_warning);
  198. btnPoptipError = findViewById(R.id.btn_poptip_error);
  199. btnPopnotification = findViewById(R.id.btn_popnotification);
  200. btnPopnotificationBigMessage = findViewById(R.id.btn_popnotification_bigMessage);
  201. btnPopnotificationOverlay = findViewById(R.id.btn_popnotification_overlay);
  202. btnBottomDialog = findViewById(R.id.btn_bottom_dialog);
  203. btnBottomMenu = findViewById(R.id.btn_bottom_menu);
  204. btnBottomReply = findViewById(R.id.btn_bottom_reply);
  205. btnBottomSelectMenu = findViewById(R.id.btn_bottom_select_menu);
  206. btnBottomMultiSelectMenu = findViewById(R.id.btn_bottom_multiSelect_menu);
  207. btnBottomCustomRecycleView = findViewById(R.id.btn_bottom_custom_recycleView);
  208. btnCustomMessageDialog = findViewById(R.id.btn_customMessageDialog);
  209. btnCustomInputDialog = findViewById(R.id.btn_customInputDialog);
  210. btnCustomBottomMenu = findViewById(R.id.btn_customBottomMenu);
  211. btnCustomDialog = findViewById(R.id.btn_customDialog);
  212. btnCustomDialogAlign = findViewById(R.id.btn_customDialogAlign);
  213. btnFullScreenDialogWebPage = findViewById(R.id.btn_fullScreenDialog_webPage);
  214. btnFullScreenDialogLogin = findViewById(R.id.btn_fullScreenDialog_login);
  215. btnFullScreenDialogFragment = findViewById(R.id.btn_fullScreenDialog_fragment);
  216. btnContextMenu = findViewById(R.id.btn_contextMenu);
  217. btnSelectMenu = findViewById(R.id.btn_selectMenu);
  218. btnShowGuide = findViewById(R.id.btn_showGuide);
  219. btnShowGuideBaseView = findViewById(R.id.btn_showGuideBaseView);
  220. btnShowGuideBaseViewRectangle = findViewById(R.id.btn_showGuideBaseViewRectangle);
  221. btnShowBreak = findViewById(R.id.btn_showBreak);
  222. btnListDialog = findViewById(R.id.btn_listDialog);
  223. txtVer = findViewById(R.id.txt_ver);
  224. }
  225. @Override
  226. public void initDatas(JumpParameter parameter) {
  227. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  228. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
  229. getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
  230. @Override
  231. public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
  232. boxTitle.setPadding(0, insets.getSystemWindowInsetTop(), 0, 0);
  233. boxBody.setPadding(dip2px(15), dip2px(15), dip2px(15), insets.getSystemWindowInsetBottom() + dip2px(250));
  234. return insets;
  235. }
  236. });
  237. } else {
  238. getRootView().setFitsSystemWindows(true);
  239. }
  240. refreshUIMode();
  241. boolean showBreak = parameter.getBoolean("showBreak");
  242. if (showBreak) {
  243. txtTitle.setText("显示Dialog时关闭Activity演示");
  244. MessageDialog.show("提示", "接下来会直接运行一个 WaitDialog,2 秒后直接关闭 Activity,并回到原 Activity,保证程序不会出现 WindowLeaked 错误。\n\n" +
  245. "Android 原生 AlertDialog 常出现因 Activity 先于 Dialog 关闭而导致此错误引发程序崩溃。\n\n" +
  246. "而使用 DialogX 构建的对话框不仅仅不会出现此问题,还可避免因句柄持续持有导致的内存泄漏。", "开始测试", "取消")
  247. .setOkButton(new OnDialogButtonClickListener() {
  248. @Override
  249. public boolean onClick(BaseDialog baseDialog, View v) {
  250. WaitDialog.show("请稍后...");
  251. runDelayed(new Runnable() {
  252. @Override
  253. public void run() {
  254. finish(); //先结束掉本界面
  255. }
  256. }, 2000);
  257. return false;
  258. }
  259. })
  260. .setCancelButton(new OnDialogButtonClickListener() {
  261. @Override
  262. public boolean onClick(BaseDialog baseDialog, View v) {
  263. finish();
  264. return false;
  265. }
  266. })
  267. .setCancelable(false);
  268. }
  269. switch (DialogX.implIMPLMode) {
  270. case VIEW:
  271. rdoModeView.setChecked(true);
  272. break;
  273. case WINDOW:
  274. rdoModeWindow.setChecked(true);
  275. break;
  276. case DIALOG_FRAGMENT:
  277. rdoModeDialogFragment.setChecked(true);
  278. break;
  279. case FLOATING_ACTIVITY:
  280. rdoModeFloatingActivity.setChecked(true);
  281. break;
  282. }
  283. txtVer.setText("当前版本:" + BuildConfig.VERSION_NAME);
  284. // //合并处理演示,在 onDismiss 中获取用户选择进行统一处理,以防止编写大量可能在不同选择下都要处理的重复代码
  285. // MessageDialog.show("Title", "Ask Question", "OK", "NO", "OTHER").setDialogLifecycleCallback(new DialogLifecycleCallback<MessageDialog>() {
  286. // @Override
  287. // public void onDismiss(MessageDialog dialog) {
  288. // /**
  289. // * dialog.getButtonSelectResult() 支持 MessageDialog 和 BottomDialog
  290. // * 两种具有选择功能的对话框。
  291. // * 包含四种状态:
  292. // * NONE, //未做出选择
  293. // * BUTTON_OK, //选择了确定按钮
  294. // * BUTTON_CANCEL, //选择了取消按钮
  295. // * BUTTON_OTHER //选择了其他按钮
  296. // */
  297. // if (dialog.getButtonSelectResult() == BaseDialog.BUTTON_SELECT_RESULT.BUTTON_OK) {
  298. // MessageDialog.show("Title", "You Select OK Button!", "OK");
  299. // } else {
  300. // TipDialog.show("Other Select!", WaitDialog.TYPE.WARNING);
  301. // }
  302. // }
  303. // });
  304. // //复写事件演示
  305. // new MessageDialog() {
  306. // @Override
  307. // public void onShow(MessageDialog dialog) {
  308. // //...
  309. // tip("onShow");
  310. // }
  311. //
  312. // @Override
  313. // public void onDismiss(MessageDialog dialog) {
  314. // WaitDialog.show("Please Wait...");
  315. // if (dialog.getButtonSelectResult() == BUTTON_SELECT_RESULT.BUTTON_OK) {
  316. // //点击了OK的情况
  317. // //...
  318. // } else {
  319. // //其他按钮点击、对话框dismiss的情况
  320. // //...
  321. // }
  322. // tip("onDismiss");
  323. // }
  324. // }
  325. // .setTitle("Title")
  326. // .setMessage("message")
  327. // .setOkButton("OK")
  328. // .setCancelButton("Cancel")
  329. // .show();
  330. }
  331. //用于模拟进度提示
  332. private CycleRunner cycleRunner;
  333. private float progress = 0;
  334. private int waitId;
  335. private TextView btnReplyCommit;
  336. private EditText editReplyCommit;
  337. private TextView btnCancel;
  338. private TextView btnSubmit;
  339. private RelativeLayout boxUserName;
  340. private EditText editUserName;
  341. private RelativeLayout boxPassword;
  342. private EditText editPassword;
  343. private TextView btnLicense;
  344. private TextView btnClose;
  345. private WebView webView;
  346. private String[] singleSelectMenuText = new String[]{"拒绝", "询问", "始终允许", "仅在使用中允许"};
  347. private int selectMenuIndex;
  348. private String[] multiSelectMenuText = new String[]{"上海", "北京", "广州", "深圳"};
  349. private int[] selectMenuIndexArray;
  350. private String multiSelectMenuResultCache;
  351. @Override
  352. public void setEvents() {
  353. grpMode.addOnButtonCheckedListener(new MaterialButtonToggleGroup.OnButtonCheckedListener() {
  354. @Override
  355. public void onButtonChecked(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) {
  356. BaseDialog.cleanAll();
  357. switch (checkedId) {
  358. case R.id.rdo_mode_view:
  359. DialogX.implIMPLMode = DialogX.IMPL_MODE.VIEW;
  360. break;
  361. case R.id.rdo_mode_window:
  362. DialogX.implIMPLMode = DialogX.IMPL_MODE.WINDOW;
  363. break;
  364. case R.id.rdo_mode_dialogFragment:
  365. DialogX.implIMPLMode = DialogX.IMPL_MODE.DIALOG_FRAGMENT;
  366. break;
  367. case R.id.rdo_mode_floatingActivity:
  368. DialogX.implIMPLMode = DialogX.IMPL_MODE.FLOATING_ACTIVITY;
  369. break;
  370. }
  371. }
  372. });
  373. grpTheme.addOnButtonCheckedListener(new MaterialButtonToggleGroup.OnButtonCheckedListener() {
  374. @Override
  375. public void onButtonChecked(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) {
  376. switch (checkedId) {
  377. case R.id.rdo_auto:
  378. DialogX.globalTheme = DialogX.THEME.AUTO;
  379. break;
  380. case R.id.rdo_light:
  381. DialogX.globalTheme = DialogX.THEME.LIGHT;
  382. break;
  383. case R.id.rdo_dark:
  384. DialogX.globalTheme = DialogX.THEME.DARK;
  385. break;
  386. }
  387. }
  388. });
  389. grpStyle.addOnButtonCheckedListener(new MaterialButtonToggleGroup.OnButtonCheckedListener() {
  390. @Override
  391. public void onButtonChecked(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) {
  392. DialogX.cancelButtonText = "取消";
  393. DialogX.titleTextInfo = null;
  394. DialogX.buttonTextInfo = null;
  395. switch (checkedId) {
  396. case R.id.rdo_material:
  397. DialogX.globalStyle = MaterialStyle.style();
  398. DialogX.cancelButtonText = "";
  399. break;
  400. case R.id.rdo_kongzue:
  401. DialogX.globalStyle = KongzueStyle.style();
  402. break;
  403. case R.id.rdo_ios:
  404. DialogX.globalStyle = IOSStyle.style();
  405. break;
  406. case R.id.rdo_miui:
  407. DialogX.globalStyle = MIUIStyle.style();
  408. break;
  409. case R.id.rdo_material_you:
  410. DialogX.globalStyle = MaterialYouStyle.style();
  411. break;
  412. }
  413. }
  414. });
  415. btnShare.setOnClickListener(new View.OnClickListener() {
  416. @Override
  417. public void onClick(View v) {
  418. openUrl("https://github.com/kongzue/DialogX");
  419. }
  420. });
  421. btnContextMenu.setOnClickListener(new View.OnClickListener() {
  422. @Override
  423. public void onClick(View v) {
  424. PopMenu.show(new String[]{"添加", "编辑", "删除", "分享"})
  425. .setOnMenuItemClickListener(new OnMenuItemClickListener<PopMenu>() {
  426. @Override
  427. public boolean onClick(PopMenu dialog, CharSequence text, int index) {
  428. if (index == 0) {
  429. dialog.setMenuList(new String[]{"产品A", "产品B", "产品C"});
  430. return true;
  431. }
  432. return false;
  433. }
  434. })
  435. .setOnIconChangeCallBack(new OnIconChangeCallBack<PopMenu>(true) {
  436. @Override
  437. public int getIcon(PopMenu dialog, int index, String menuText) {
  438. switch (menuText) {
  439. case "添加":
  440. return R.mipmap.img_dialogx_demo_add;
  441. case "编辑":
  442. return R.mipmap.img_dialogx_demo_edit;
  443. case "删除":
  444. return R.mipmap.img_dialogx_demo_delete;
  445. case "分享":
  446. return R.mipmap.img_dialogx_demo_share;
  447. default:
  448. return 0;
  449. }
  450. }
  451. });
  452. }
  453. });
  454. btnSelectMenu.setOnClickListener(new View.OnClickListener() {
  455. @Override
  456. public void onClick(View view) {
  457. PopMenu.show(view, new String[]{"选项1", "选项2", "选项3"})
  458. .setOnMenuItemClickListener(new OnMenuItemClickListener<PopMenu>() {
  459. @Override
  460. public boolean onClick(PopMenu dialog, CharSequence text, int index) {
  461. btnSelectMenu.setText(text);
  462. return false;
  463. }
  464. });
  465. }
  466. });
  467. btnFullScreenDialogFragment.setOnClickListener(new View.OnClickListener() {
  468. @Override
  469. public void onClick(View v) {
  470. CustomFragment customFragment = new CustomFragment()
  471. .setAddButtonClickListener(new View.OnClickListener() {
  472. @Override
  473. public void onClick(View v) {
  474. btnFullScreenDialogFragment.callOnClick();
  475. }
  476. });
  477. FullScreenDialog.show(new OnBindView<FullScreenDialog>(customFragment) {
  478. @Override
  479. public void onBind(FullScreenDialog dialog, View v) {
  480. }
  481. });
  482. }
  483. });
  484. btnMessageDialog.setOnClickListener(new View.OnClickListener() {
  485. @Override
  486. public void onClick(View view) {
  487. MessageDialog.show("标题", "这里是正文内容。", "确定")
  488. .setTitleIcon(R.mipmap.img_demo_avatar)
  489. .setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
  490. @Override
  491. public boolean onClick(MessageDialog baseDialog, View v) {
  492. PopTip.show("点击确定按钮");
  493. return false;
  494. }
  495. });
  496. }
  497. });
  498. btnSelectDialog.setOnClickListener(new View.OnClickListener() {
  499. @Override
  500. public void onClick(View v) {
  501. MessageDialog messageDialog = new MessageDialog("多选对话框", "移除App会将它从主屏幕移除并保留其所有数据。", "删除App", "取消", "移至App资源库")
  502. .setButtonOrientation(LinearLayout.VERTICAL);
  503. if (!rdoMiui.isChecked()) {
  504. messageDialog.setOkTextInfo(new TextInfo().setFontColor(Color.parseColor("#EB5545")).setBold(true));
  505. }
  506. messageDialog.show();
  507. }
  508. });
  509. btnInputDialog.setOnClickListener(new View.OnClickListener() {
  510. @Override
  511. public void onClick(View view) {
  512. new InputDialog("标题", "正文内容", "确定", "取消", "正在输入的文字")
  513. .setInputText("Hello World")
  514. .setOkButton(new OnInputDialogButtonClickListener<InputDialog>() {
  515. @Override
  516. public boolean onClick(InputDialog baseDialog, View v, String inputStr) {
  517. PopTip.show("输入的内容:" + inputStr);
  518. return false;
  519. }
  520. })
  521. .show();
  522. }
  523. });
  524. btnWaitDialog.setOnClickListener(new View.OnClickListener() {
  525. @Override
  526. public void onClick(View v) {
  527. WaitDialog.show("Please Wait!")
  528. .setOnBackPressedListener(new OnBackPressedListener<WaitDialog>() {
  529. @Override
  530. public boolean onBackPressed(WaitDialog dialog) {
  531. PopTip.show("按下返回");
  532. return false;
  533. }
  534. });
  535. runDelayed(new Runnable() {
  536. @Override
  537. public void run() {
  538. WaitDialog.dismiss();
  539. }
  540. }, 1500);
  541. }
  542. });
  543. btnWaitAndTipDialog.setOnClickListener(new View.OnClickListener() {
  544. boolean closeFlag = false;
  545. @Override
  546. public void onClick(View v) {
  547. closeFlag = false;
  548. WaitDialog.show("Please Wait!").setOnBackPressedListener(new OnBackPressedListener<WaitDialog>() {
  549. @Override
  550. public boolean onBackPressed(WaitDialog dialog) {
  551. PopTip.show("按下返回", "关闭").setButton(new OnDialogButtonClickListener<PopTip>() {
  552. @Override
  553. public boolean onClick(PopTip baseDialog, View v) {
  554. closeFlag = true;
  555. WaitDialog.dismiss();
  556. return false;
  557. }
  558. });
  559. return false;
  560. }
  561. });
  562. if (!closeFlag) runDelayed(new Runnable() {
  563. @Override
  564. public void run() {
  565. if (!closeFlag) TipDialog.show("完成!", WaitDialog.TYPE.SUCCESS);
  566. }
  567. }, 1500 + new Random().nextInt(1000));
  568. }
  569. });
  570. btnTipSuccess.setOnClickListener(new View.OnClickListener() {
  571. @Override
  572. public void onClick(View v) {
  573. TipDialog.show("Success!", WaitDialog.TYPE.SUCCESS);
  574. }
  575. });
  576. btnTipWarning.setOnClickListener(new View.OnClickListener() {
  577. @Override
  578. public void onClick(View v) {
  579. TipDialog.show("Warning!", WaitDialog.TYPE.WARNING);
  580. }
  581. });
  582. btnTipError.setOnClickListener(new View.OnClickListener() {
  583. @Override
  584. public void onClick(View v) {
  585. TipDialog.show("Error!", WaitDialog.TYPE.ERROR);
  586. }
  587. });
  588. btnTipProgress.setOnClickListener(new View.OnClickListener() {
  589. @Override
  590. public void onClick(View v) {
  591. waitId = 0;
  592. progress = 0;
  593. WaitDialog.show("假装连接...").setOnBackPressedListener(new OnBackPressedListener<WaitDialog>() {
  594. @Override
  595. public boolean onBackPressed(WaitDialog dialog) {
  596. MessageDialog.show("正在进行", "是否取消?", "是", "否").setOkButton(new OnDialogButtonClickListener() {
  597. @Override
  598. public boolean onClick(BaseDialog baseDialog, View v) {
  599. waitId = -1;
  600. WaitDialog.dismiss();
  601. return false;
  602. }
  603. });
  604. return false;
  605. }
  606. });
  607. runOnMainDelayed(new Runnable() {
  608. @Override
  609. public void run() {
  610. if (waitId != 0) {
  611. return;
  612. }
  613. cycleRunner = runOnMainCycle(new Runnable() {
  614. @Override
  615. public void run() {
  616. if (waitId != 0) {
  617. cycleRunner.cancel();
  618. return;
  619. }
  620. progress = progress + 0.1f;
  621. if (progress < 1f) {
  622. WaitDialog.show("假装加载" + ((int) (progress * 100)) + "%", progress);
  623. } else {
  624. TipDialog.show("加载完成", WaitDialog.TYPE.SUCCESS);
  625. cycleRunner.cancel();
  626. }
  627. }
  628. }, 1000, 1000);
  629. }
  630. }, 3000);
  631. }
  632. });
  633. btnBottomDialog.setOnClickListener(new View.OnClickListener() {
  634. @Override
  635. public void onClick(View v) {
  636. String s = rdoMaterial.isChecked() ? "你可以向下滑动来关闭这个对话框" : "你可以点击空白区域或返回键来关闭这个对话框";
  637. new BottomDialog("标题", "这里是对话框内容。\n" + s + "。\n底部对话框也支持自定义布局扩展使用方式。",
  638. new OnBindView<BottomDialog>(R.layout.layout_custom_view) {
  639. @Override
  640. public void onBind(BottomDialog dialog, View v) {
  641. if (dialog.getDialogImpl().imgTab != null) {
  642. ((ViewGroup) dialog.getDialogImpl().imgTab.getParent()).removeView(dialog.getDialogImpl().imgTab);
  643. }
  644. v.setOnClickListener(new View.OnClickListener() {
  645. @Override
  646. public void onClick(View v) {
  647. dialog.dismiss();
  648. PopTip.show("Click Custom View");
  649. }
  650. });
  651. }
  652. })
  653. .setDialogLifecycleCallback(new BottomDialogSlideEventLifecycleCallback<BottomDialog>() {
  654. @Override
  655. public boolean onSlideClose(BottomDialog dialog) {
  656. log("#onSlideClose");
  657. return super.onSlideClose(dialog);
  658. }
  659. @Override
  660. public boolean onSlideTouchEvent(BottomDialog dialog, View v, MotionEvent event) {
  661. log("#onSlideTouchEvent: action=" + event.getAction() + " y=" + event.getY());
  662. return super.onSlideTouchEvent(dialog, v, event);
  663. }
  664. })
  665. .show();
  666. }
  667. });
  668. btnBottomMenu.setOnClickListener(new View.OnClickListener() {
  669. @Override
  670. public void onClick(View v) {
  671. if (rdoMaterial.isChecked()) {
  672. //Material 可滑动展开 BottomMenu 演示
  673. BottomMenu.build()
  674. .setBottomDialogMaxHeight(0.6f)
  675. .setMenuList(new String[]{"添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐", "添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐"})
  676. .setOnIconChangeCallBack(new OnIconChangeCallBack<BottomMenu>(true) {
  677. @Override
  678. public int getIcon(BottomMenu bottomMenu, int index, String menuText) {
  679. switch (menuText) {
  680. case "添加":
  681. return R.mipmap.img_dialogx_demo_add;
  682. case "查看":
  683. return R.mipmap.img_dialogx_demo_view;
  684. case "编辑":
  685. return R.mipmap.img_dialogx_demo_edit;
  686. case "删除":
  687. return R.mipmap.img_dialogx_demo_delete;
  688. case "分享":
  689. return R.mipmap.img_dialogx_demo_share;
  690. case "评论":
  691. return R.mipmap.img_dialogx_demo_comment;
  692. case "下载":
  693. return R.mipmap.img_dialogx_demo_download;
  694. case "收藏":
  695. return R.mipmap.img_dialogx_demo_favorite;
  696. case "赞!":
  697. return R.mipmap.img_dialogx_demo_good;
  698. case "不喜欢":
  699. return R.mipmap.img_dialogx_demo_dislike;
  700. case "所属专辑":
  701. return R.mipmap.img_dialogx_demo_album;
  702. case "复制链接":
  703. return R.mipmap.img_dialogx_demo_link;
  704. case "类似推荐":
  705. return R.mipmap.img_dialogx_demo_recommend;
  706. }
  707. return 0;
  708. }
  709. })
  710. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  711. @Override
  712. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  713. PopTip.show(text);
  714. return false;
  715. }
  716. })
  717. .show();
  718. } else {
  719. BottomMenu.show(new String[]{"新标签页中打开", "稍后阅读", "复制链接网址"})
  720. .setMessage("http://www.kongzue.com/DialogX")
  721. .setMenuItemTextInfoInterceptor(new MenuItemTextInfoInterceptor<BottomMenu>() {
  722. @Override
  723. public TextInfo menuItemTextInfo(BottomMenu dialog, int index, String menuText) {
  724. if (index == 2) {
  725. return new TextInfo()
  726. .setFontColor(Color.RED)
  727. .setBold(true);
  728. }
  729. return null;
  730. }
  731. })
  732. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  733. @Override
  734. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  735. PopTip.show(text);
  736. return false;
  737. }
  738. });
  739. }
  740. }
  741. });
  742. btnBottomReply.setOnClickListener(new View.OnClickListener() {
  743. @Override
  744. public void onClick(View v) {
  745. BottomDialog.show(new OnBindView<BottomDialog>(rdoDark.isChecked() ? R.layout.layout_custom_reply_dark : R.layout.layout_custom_reply) {
  746. @Override
  747. public void onBind(final BottomDialog dialog, View v) {
  748. btnReplyCommit = v.findViewById(R.id.btn_reply_commit);
  749. editReplyCommit = v.findViewById(R.id.edit_reply_commit);
  750. btnReplyCommit.setOnClickListener(new View.OnClickListener() {
  751. @Override
  752. public void onClick(View v) {
  753. dialog.dismiss();
  754. PopTip.show("提交内容:\n" + editReplyCommit.getText().toString());
  755. }
  756. });
  757. editReplyCommit.postDelayed(new Runnable() {
  758. @Override
  759. public void run() {
  760. showIME(editReplyCommit);
  761. }
  762. }, 300);
  763. }
  764. })
  765. .setAllowInterceptTouch(false);
  766. }
  767. });
  768. btnCustomMessageDialog.setOnClickListener(new View.OnClickListener() {
  769. @Override
  770. public void onClick(View v) {
  771. MessageDialog.show("这里是标题", "此对话框演示的是自定义对话框内部布局的效果", "确定", "取消")
  772. .setCustomView(new OnBindView<MessageDialog>(R.layout.layout_custom_view) {
  773. @Override
  774. public void onBind(MessageDialog dialog, View v) {
  775. }
  776. });
  777. }
  778. });
  779. btnCustomInputDialog.setOnClickListener(new View.OnClickListener() {
  780. @Override
  781. public void onClick(View v) {
  782. InputDialog.show("这里是标题", "此对话框演示的是自定义对话框内部布局的效果", "确定", "取消")
  783. .setCustomView(new OnBindView<MessageDialog>(R.layout.layout_custom_view) {
  784. @Override
  785. public void onBind(MessageDialog dialog, View v) {
  786. }
  787. });
  788. }
  789. });
  790. btnCustomBottomMenu.setOnClickListener(new View.OnClickListener() {
  791. @Override
  792. public void onClick(View v) {
  793. BottomMenu.show(new String[]{"新标签页中打开", "稍后阅读", "复制链接网址"})
  794. .setMessage("http://www.kongzue.com/DialogX")
  795. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  796. @Override
  797. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  798. PopTip.show(text);
  799. return false;
  800. }
  801. })
  802. .setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_view) {
  803. @Override
  804. public void onBind(BottomDialog dialog, View v) {
  805. }
  806. });
  807. }
  808. });
  809. btnShowGuide.setOnClickListener(new View.OnClickListener() {
  810. @Override
  811. public void onClick(View v) {
  812. GuideDialog.show(R.mipmap.img_guide_tip);
  813. }
  814. });
  815. btnShowGuideBaseView.setOnClickListener(new View.OnClickListener() {
  816. @Override
  817. public void onClick(View v) {
  818. GuideDialog.show(btnFullScreenDialogLogin, R.mipmap.img_tip_login)
  819. .setBaseViewMarginTop(-dip2px(30));
  820. }
  821. });
  822. btnShowGuideBaseViewRectangle.setOnClickListener(new View.OnClickListener() {
  823. @Override
  824. public void onClick(View v) {
  825. GuideDialog.show(btnCustomDialogAlign,
  826. GuideDialog.STAGE_LIGHT_TYPE.RECTANGLE,
  827. R.mipmap.img_tip_login_clicktest)
  828. .setStageLightFilletRadius(dip2px(5))
  829. .setBaseViewMarginTop(-dip2px(30))
  830. .setOnBackgroundMaskClickListener(new OnBackgroundMaskClickListener<CustomDialog>() {
  831. @Override
  832. public boolean onClick(CustomDialog dialog, View v) {
  833. toast("点击了外围遮罩");
  834. return false;
  835. }
  836. })
  837. .setOnStageLightPathClickListener(new OnDialogButtonClickListener<GuideDialog>() {
  838. @Override
  839. public boolean onClick(GuideDialog dialog, View v) {
  840. toast("点击了原按钮");
  841. btnCustomDialogAlign.callOnClick();
  842. return false;
  843. }
  844. });
  845. }
  846. });
  847. btnShowBreak.setOnClickListener(new View.OnClickListener() {
  848. @Override
  849. public void onClick(View v) {
  850. jump(MainActivity.class, new JumpParameter().put("showBreak", true).put("fromActivity", getInstanceKey()));
  851. }
  852. });
  853. btnListDialog.setOnClickListener(new View.OnClickListener() {
  854. @Override
  855. public void onClick(View v) {
  856. DialogX.showDialogList(
  857. MessageDialog.build().setTitle("提示").setMessage("这是一组消息对话框队列").setOkButton("开始").setCancelButton("取消")
  858. .setCancelButton(new OnDialogButtonClickListener<MessageDialog>() {
  859. @Override
  860. public boolean onClick(MessageDialog dialog, View v) {
  861. dialog.cleanDialogList();
  862. return false;
  863. }
  864. }),
  865. PopTip.build().setMessage("每个对话框会依次显示"),
  866. PopNotification.build().setTitle("通知提示").setMessage("直到上一个对话框消失"),
  867. InputDialog.build().setTitle("请注意").setMessage("你必须使用 .build() 方法构建,并保证不要自己执行 .show() 方法").setInputText("输入文字").setOkButton("知道了"),
  868. TipDialog.build().setMessageContent("准备结束...").setTipType(WaitDialog.TYPE.SUCCESS),
  869. BottomDialog.build().setTitle("结束").setMessage("下滑以结束旅程,祝你编码愉快!").setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_dialog) {
  870. @Override
  871. public void onBind(BottomDialog dialog, View v) {
  872. ImageView btnOk;
  873. btnOk = v.findViewById(R.id.btn_ok);
  874. btnOk.setOnClickListener(new View.OnClickListener() {
  875. @Override
  876. public void onClick(View v) {
  877. dialog.dismiss();
  878. }
  879. });
  880. }
  881. })
  882. );
  883. }
  884. });
  885. btnFullScreenDialogLogin.setOnClickListener(new View.OnClickListener() {
  886. /**
  887. * 采用异步加载布局防止卡顿测试
  888. */
  889. OnBindView<FullScreenDialog> onBindView;
  890. @Override
  891. public void onClick(View v) {
  892. onBindView = new OnBindView<FullScreenDialog>(R.layout.layout_full_login, true) {
  893. @Override
  894. public void onBind(FullScreenDialog dialog, View v) {
  895. btnCancel = v.findViewById(R.id.btn_cancel);
  896. btnSubmit = v.findViewById(R.id.btn_submit);
  897. boxUserName = v.findViewById(R.id.box_userName);
  898. editUserName = v.findViewById(R.id.edit_userName);
  899. boxPassword = v.findViewById(R.id.box_password);
  900. editPassword = v.findViewById(R.id.edit_password);
  901. btnLicense = v.findViewById(R.id.btn_license);
  902. initFullScreenLoginDemo(dialog);
  903. }
  904. };
  905. FullScreenDialog.show(onBindView);
  906. }
  907. });
  908. btnFullScreenDialogWebPage.setOnClickListener(new View.OnClickListener() {
  909. @Override
  910. public void onClick(View v) {
  911. FullScreenDialog.build(new OnBindView<FullScreenDialog>(R.layout.layout_full_webview) {
  912. @Override
  913. public void onBind(final FullScreenDialog dialog, View v) {
  914. btnClose = v.findViewById(R.id.btn_close);
  915. webView = v.findViewById(R.id.webView);
  916. btnClose.setOnClickListener(new View.OnClickListener() {
  917. @Override
  918. public void onClick(View v) {
  919. dialog.dismiss();
  920. }
  921. });
  922. WebSettings webSettings = webView.getSettings();
  923. webSettings.setJavaScriptEnabled(true);
  924. webSettings.setLoadWithOverviewMode(true);
  925. webSettings.setUseWideViewPort(true);
  926. webSettings.setSupportZoom(false);
  927. webSettings.setAllowFileAccess(true);
  928. webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
  929. webSettings.setLoadsImagesAutomatically(true);
  930. webSettings.setDefaultTextEncodingName("utf-8");
  931. webView.setWebViewClient(new WebViewClient() {
  932. @Override
  933. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  934. try {
  935. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  936. startActivity(intent);
  937. } catch (ActivityNotFoundException e) {
  938. e.printStackTrace();
  939. }
  940. return true;
  941. }
  942. @Override
  943. public void onPageFinished(WebView view, String url) {
  944. super.onPageFinished(view, url);
  945. }
  946. });
  947. webView.loadUrl("https://github.com/kongzue/DialogX");
  948. }
  949. })
  950. .show();
  951. }
  952. });
  953. btnCustomDialog.setOnClickListener(new View.OnClickListener() {
  954. @Override
  955. public void onClick(View v) {
  956. CustomDialog.show(new OnBindView<CustomDialog>(R.layout.layout_custom_dialog) {
  957. @Override
  958. public void onBind(final CustomDialog dialog, View v) {
  959. ImageView btnOk;
  960. btnOk = v.findViewById(R.id.btn_ok);
  961. btnOk.setOnClickListener(new View.OnClickListener() {
  962. @Override
  963. public void onClick(View v) {
  964. dialog.dismiss();
  965. }
  966. });
  967. }
  968. })
  969. .setMaskColor(getResources().getColor(R.color.black30))
  970. //实现完全自定义动画效果
  971. // .setDialogXAnimImpl(new DialogXAnimInterface<CustomDialog>() {
  972. // @Override
  973. // public void doShowAnim(CustomDialog customDialog, ObjectRunnable<Float> animProgress) {
  974. // Animation enterAnim;
  975. //
  976. // int enterAnimResId = com.kongzue.dialogx.R.anim.anim_dialogx_top_enter;
  977. // enterAnim = AnimationUtils.loadAnimation(me, enterAnimResId);
  978. // enterAnim.setInterpolator(new DecelerateInterpolator(2f));
  979. //
  980. // long enterAnimDurationTemp = enterAnim.getDuration();
  981. //
  982. // enterAnim.setDuration(enterAnimDurationTemp);
  983. // customDialog.getDialogImpl().boxCustom.startAnimation(enterAnim);
  984. //
  985. // ValueAnimator bkgAlpha = ValueAnimator.ofFloat(0f, 1f);
  986. // bkgAlpha.setDuration(enterAnimDurationTemp);
  987. // bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  988. // @Override
  989. // public void onAnimationUpdate(ValueAnimator animation) {
  990. // animProgress.run((Float) animation.getAnimatedValue());
  991. // }
  992. // });
  993. // bkgAlpha.start();
  994. // }
  995. //
  996. // @Override
  997. // public void doExitAnim(CustomDialog customDialog, ObjectRunnable<Float> animProgress) {
  998. // int exitAnimResIdTemp = com.kongzue.dialogx.R.anim.anim_dialogx_default_exit;
  999. //
  1000. // Animation exitAnim = AnimationUtils.loadAnimation(me, exitAnimResIdTemp);
  1001. // customDialog.getDialogImpl().boxCustom.startAnimation(exitAnim);
  1002. //
  1003. // ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
  1004. // bkgAlpha.setDuration(exitAnim.getDuration());
  1005. // bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  1006. // @Override
  1007. // public void onAnimationUpdate(ValueAnimator animation) {
  1008. // animProgress.run((Float) animation.getAnimatedValue());
  1009. // }
  1010. // });
  1011. // bkgAlpha.start();
  1012. // }
  1013. // })
  1014. ;
  1015. }
  1016. });
  1017. btnCustomDialogAlign.setOnClickListener(new View.OnClickListener() {
  1018. @Override
  1019. public void onClick(View v) {
  1020. CustomDialog.show(new OnBindView<CustomDialog>(R.layout.layout_custom_dialog_align) {
  1021. private TextView btnSelectPositive;
  1022. @Override
  1023. public void onBind(final CustomDialog dialog, View v) {
  1024. btnSelectPositive = v.findViewById(R.id.btn_selectPositive);
  1025. btnSelectPositive.setOnClickListener(new View.OnClickListener() {
  1026. @Override
  1027. public void onClick(View v) {
  1028. PopTip.show("我知道了");
  1029. dialog.dismiss();
  1030. }
  1031. });
  1032. }
  1033. })
  1034. .setCancelable(false)
  1035. .setMaskColor(getResources().getColor(R.color.black30))
  1036. .setEnterAnimResId(R.anim.anim_custom_pop_enter)
  1037. .setExitAnimResId(R.anim.anim_custom_pop_exit)
  1038. .setAlignBaseViewGravity(btnCustomDialogAlign, Gravity.TOP | Gravity.CENTER_HORIZONTAL)
  1039. .setBaseViewMarginBottom(-dip2px(45))
  1040. .show();
  1041. }
  1042. });
  1043. btnPoptip.setOnClickListener(new View.OnClickListener() {
  1044. @Override
  1045. public void onClick(View v) {
  1046. PopTip.show("这是一个提示");
  1047. }
  1048. });
  1049. btnPoptipBigMessage.setOnClickListener(new View.OnClickListener() {
  1050. @Override
  1051. public void onClick(View v) {
  1052. if (rdoIos.isChecked()) {
  1053. PopTip.show(R.mipmap.img_air_pods_pro, "AirPods Pro 已连接").setTintIcon(false).showLong();
  1054. } else {
  1055. PopTip.show(R.mipmap.img_mail_line_white, "邮件已发送", "撤回").setButton(new OnDialogButtonClickListener<PopTip>() {
  1056. @Override
  1057. public boolean onClick(PopTip popTip, View v) {
  1058. //点击“撤回”按钮回调
  1059. toast("邮件已撤回");
  1060. return false;
  1061. }
  1062. }).setTintIcon(true).showLong();
  1063. }
  1064. }
  1065. });
  1066. btnPoptipSuccess.setOnClickListener(new View.OnClickListener() {
  1067. @Override
  1068. public void onClick(View v) {
  1069. PopTip.show("操作已完成").iconSuccess();
  1070. }
  1071. });
  1072. btnPoptipWarning.setOnClickListener(new View.OnClickListener() {
  1073. @Override
  1074. public void onClick(View v) {
  1075. PopTip.show("存储空间不足").setButton("立即清理", new OnDialogButtonClickListener<PopTip>() {
  1076. @Override
  1077. public boolean onClick(PopTip baseDialog, View v) {
  1078. return false;
  1079. }
  1080. }).iconWarning();
  1081. }
  1082. });
  1083. btnPoptipError.setOnClickListener(new View.OnClickListener() {
  1084. @Override
  1085. public void onClick(View v) {
  1086. PopTip.show("无法连接网络").iconError();
  1087. }
  1088. });
  1089. btnBottomSelectMenu.setOnClickListener(new View.OnClickListener() {
  1090. @Override
  1091. public void onClick(View v) {
  1092. BottomMenu.show(singleSelectMenuText)
  1093. .setMessage("这里是权限确认的文本说明,这是一个演示菜单")
  1094. .setTitle("获得权限标题")
  1095. .setOnMenuItemClickListener(new OnMenuItemSelectListener<BottomMenu>() {
  1096. @Override
  1097. public void onOneItemSelect(BottomMenu dialog, CharSequence text, int index, boolean select) {
  1098. selectMenuIndex = index;
  1099. }
  1100. })
  1101. .setCancelButton("确定", new OnDialogButtonClickListener<BottomDialog>() {
  1102. @Override
  1103. public boolean onClick(BottomDialog baseDialog, View v) {
  1104. PopTip.show("已选择:" + singleSelectMenuText[selectMenuIndex]);
  1105. return false;
  1106. }
  1107. })
  1108. .setSelection(selectMenuIndex);
  1109. }
  1110. });
  1111. btnBottomMultiSelectMenu.setOnClickListener(new View.OnClickListener() {
  1112. @Override
  1113. public void onClick(View v) {
  1114. BottomMenu.show(multiSelectMenuText)
  1115. .setMessage("这里是权限确认的文本说明,这是一个演示菜单")
  1116. .setTitle("获得权限标题")
  1117. .setOnMenuItemClickListener(new OnMenuItemSelectListener<BottomMenu>() {
  1118. @Override
  1119. public void onMultiItemSelect(BottomMenu dialog, CharSequence[] text, int[] index) {
  1120. multiSelectMenuResultCache = "";
  1121. for (CharSequence c : text) {
  1122. multiSelectMenuResultCache = multiSelectMenuResultCache + " " + c;
  1123. }
  1124. selectMenuIndexArray = index;
  1125. }
  1126. })
  1127. .setCancelButton("确定", new OnDialogButtonClickListener<BottomDialog>() {
  1128. @Override
  1129. public boolean onClick(BottomDialog baseDialog, View v) {
  1130. PopTip.show("已选择:" + multiSelectMenuResultCache);
  1131. return false;
  1132. }
  1133. })
  1134. .setSelection(selectMenuIndexArray);
  1135. }
  1136. });
  1137. btnBottomCustomRecycleView.setOnClickListener(new View.OnClickListener() {
  1138. @Override
  1139. public void onClick(View v) {
  1140. BottomDialog.build()
  1141. .setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_recycleview) {
  1142. @Override
  1143. public void onBind(BottomDialog dialog, View v) {
  1144. List<CustomRecycleViewAdapter.Data> dataArrayList = new ArrayList<>();
  1145. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 1"));
  1146. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 2"));
  1147. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 3"));
  1148. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 4"));
  1149. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 5"));
  1150. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 6"));
  1151. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 7"));
  1152. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 8"));
  1153. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 9"));
  1154. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 10"));
  1155. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 11"));
  1156. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 12"));
  1157. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 13"));
  1158. dataArrayList.add(new CustomRecycleViewAdapter.Data("Item Text 14"));
  1159. RecyclerView recyclerView = (RecyclerView) v;
  1160. LinearLayoutManager layoutManager = new LinearLayoutManager(me);
  1161. recyclerView.setLayoutManager(layoutManager);
  1162. CustomRecycleViewAdapter adapter = new CustomRecycleViewAdapter(dataArrayList);
  1163. adapter.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  1164. @Override
  1165. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  1166. PopTip.show("点击了第 " + position + " 个");
  1167. }
  1168. });
  1169. recyclerView.setAdapter(adapter);
  1170. }
  1171. })
  1172. .show();
  1173. }
  1174. });
  1175. btnPopnotification.setOnClickListener(new View.OnClickListener() {
  1176. @Override
  1177. public void onClick(View v) {
  1178. notificationIndex++;
  1179. PopNotification.show("这是一条消息 " + notificationIndex)
  1180. .setOnPopNotificationClickListener(new OnDialogButtonClickListener<PopNotification>() {
  1181. @Override
  1182. public boolean onClick(PopNotification dialog, View v) {
  1183. TipDialog.show("点击了通知");
  1184. return false;
  1185. }
  1186. });
  1187. }
  1188. });
  1189. btnPopnotificationBigMessage.setOnClickListener(new View.OnClickListener() {
  1190. @Override
  1191. public void onClick(View v) {
  1192. Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.img_demo_avatar);
  1193. notificationIndex++;
  1194. PopNotification.show("这是一条消息 " + notificationIndex, "吃了没?\uD83E\uDD6A")
  1195. .setIcon(icon)
  1196. .setButton("回复", new OnDialogButtonClickListener<PopNotification>() {
  1197. @Override
  1198. public boolean onClick(PopNotification baseDialog, View v) {
  1199. PopTip.show("点击回复按钮");
  1200. return false;
  1201. }
  1202. })
  1203. .showLong();
  1204. }
  1205. });
  1206. btnPopnotificationOverlay.setOnClickListener(new View.OnClickListener() {
  1207. @Override
  1208. public void onClick(View v) {
  1209. DialogX.globalHoverWindow = true;
  1210. //悬浮窗权限检查
  1211. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  1212. if (!Settings.canDrawOverlays(me)) {
  1213. Toast.makeText(me, "使用 DialogX.globalHoverWindow 必须开启悬浮窗权限", Toast.LENGTH_LONG).show();
  1214. Intent intent = new Intent();
  1215. intent.setAction(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
  1216. startActivity(intent);
  1217. return;
  1218. }
  1219. }
  1220. Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.img_demo_avatar);
  1221. notificationIndex++;
  1222. Toast.makeText(me, "会在1秒后显示悬浮窗!", Toast.LENGTH_LONG).show();
  1223. //跳转到桌面
  1224. Intent intent = new Intent(Intent.ACTION_MAIN);
  1225. intent.addCategory(Intent.CATEGORY_HOME);
  1226. intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
  1227. startActivity(intent);
  1228. //等待一秒后显示
  1229. new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
  1230. @Override
  1231. public void run() {
  1232. PopNotification.build()
  1233. .setDialogImplMode(DialogX.IMPL_MODE.WINDOW)
  1234. .setTitle("这是一条消息 " + notificationIndex)
  1235. .setIcon(icon)
  1236. .setButton("回复", new OnDialogButtonClickListener<PopNotification>() {
  1237. @Override
  1238. public boolean onClick(PopNotification baseDialog, View v) {
  1239. Intent intent = new Intent(me, MainActivity.class);
  1240. intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  1241. startActivity(intent);
  1242. return false;
  1243. }
  1244. })
  1245. .showLong();
  1246. }
  1247. }, 1000);
  1248. }
  1249. });
  1250. }
  1251. int notificationIndex;
  1252. private void initFullScreenLoginDemo(final FullScreenDialog fullScreenDialog) {
  1253. btnCancel.setOnClickListener(new View.OnClickListener() {
  1254. @Override
  1255. public void onClick(View v) {
  1256. fullScreenDialog.dismiss();
  1257. }
  1258. });
  1259. btnCancel.setText("取消");
  1260. btnSubmit.setText("下一步");
  1261. btnLicense.setOnClickListener(new View.OnClickListener() {
  1262. @Override
  1263. public void onClick(View v) {
  1264. PopTip.show("点击用户服务条款");
  1265. }
  1266. });
  1267. btnSubmit.setOnClickListener(new View.OnClickListener() {
  1268. @Override
  1269. public void onClick(View v) {
  1270. if (isNull(editUserName.getText().toString().trim())) {
  1271. hideIME(null);
  1272. TipDialog.show("请输入账号", TipDialog.TYPE.WARNING);
  1273. return;
  1274. }
  1275. boxUserName.animate().x(-getDisplayWidth()).setDuration(300);
  1276. boxPassword.setX(getDisplayWidth());
  1277. boxPassword.setVisibility(View.VISIBLE);
  1278. boxPassword.animate().x(0).setDuration(300);
  1279. editPassword.setFocusable(true);
  1280. editPassword.requestFocus();
  1281. btnCancel.setText("上一步");
  1282. btnCancel.setOnClickListener(new View.OnClickListener() {
  1283. @Override
  1284. public void onClick(View v) {
  1285. boxUserName.animate().x(0).setDuration(300);
  1286. boxPassword.animate().x(getDisplayWidth()).setDuration(300);
  1287. editUserName.setFocusable(true);
  1288. editUserName.requestFocus();
  1289. initFullScreenLoginDemo(fullScreenDialog);
  1290. }
  1291. });
  1292. btnSubmit.setText("登录");
  1293. btnSubmit.setOnClickListener(new View.OnClickListener() {
  1294. @Override
  1295. public void onClick(View v) {
  1296. hideIME(null);
  1297. if (isNull(editPassword.getText().toString().trim())) {
  1298. TipDialog.show("请输入密码", TipDialog.TYPE.WARNING);
  1299. return;
  1300. }
  1301. WaitDialog.show("登录中...");
  1302. runOnMainDelayed(new Runnable() {
  1303. @Override
  1304. public void run() {
  1305. TipDialog.show("登录成功", TipDialog.TYPE.SUCCESS).setDialogLifecycleCallback(new DialogLifecycleCallback<WaitDialog>() {
  1306. @Override
  1307. public void onDismiss(WaitDialog dialog) {
  1308. fullScreenDialog.dismiss();
  1309. }
  1310. });
  1311. }
  1312. }, 2000);
  1313. }
  1314. });
  1315. }
  1316. });
  1317. }
  1318. @Override
  1319. public void onBackPressed() {
  1320. log("#MainActivity.onBackPressed");
  1321. super.onBackPressed();
  1322. }
  1323. public void showIME(EditText editText) {
  1324. if (editText == null) {
  1325. return;
  1326. }
  1327. editText.requestFocus();
  1328. editText.setFocusableInTouchMode(true);
  1329. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  1330. imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
  1331. }
  1332. @Override
  1333. public void onConfigurationChanged(@NonNull Configuration newConfig) {
  1334. super.onConfigurationChanged(newConfig);
  1335. refreshUIMode();
  1336. }
  1337. /**
  1338. * 刷新亮暗色模式界面变化
  1339. */
  1340. private void refreshUIMode() {
  1341. if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO) {
  1342. setDarkStatusBarTheme(true);
  1343. } else {
  1344. setDarkStatusBarTheme(false);
  1345. }
  1346. }
  1347. }