MainActivity.java 71 KB

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