MainActivity.java 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028
  1. package com.kongzue.dialogxdemo.activity;
  2. import android.content.ActivityNotFoundException;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.res.Configuration;
  6. import android.graphics.Color;
  7. import android.net.Uri;
  8. import android.view.Gravity;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.view.WindowManager;
  12. import android.view.inputmethod.InputMethodManager;
  13. import android.webkit.WebSettings;
  14. import android.webkit.WebView;
  15. import android.webkit.WebViewClient;
  16. import android.widget.EditText;
  17. import android.widget.ImageView;
  18. import android.widget.LinearLayout;
  19. import android.widget.RadioButton;
  20. import android.widget.RadioGroup;
  21. import android.widget.RelativeLayout;
  22. import android.widget.TextView;
  23. import androidx.annotation.NonNull;
  24. import androidx.constraintlayout.widget.ConstraintLayout;
  25. import androidx.recyclerview.widget.LinearLayoutManager;
  26. import androidx.recyclerview.widget.RecyclerView;
  27. import com.kongzue.baseframework.BaseActivity;
  28. import com.kongzue.baseframework.interfaces.DarkNavigationBarTheme;
  29. import com.kongzue.baseframework.interfaces.DarkStatusBarTheme;
  30. import com.kongzue.baseframework.interfaces.Layout;
  31. import com.kongzue.baseframework.interfaces.NavigationBarBackgroundColorRes;
  32. import com.kongzue.baseframework.util.CycleRunner;
  33. import com.kongzue.baseframework.util.JumpParameter;
  34. import com.kongzue.dialogx.DialogX;
  35. import com.kongzue.dialogx.dialogs.BottomDialog;
  36. import com.kongzue.dialogx.dialogs.BottomMenu;
  37. import com.kongzue.dialogx.dialogs.CustomDialog;
  38. import com.kongzue.dialogx.dialogs.FullScreenDialog;
  39. import com.kongzue.dialogx.dialogs.InputDialog;
  40. import com.kongzue.dialogx.dialogs.MessageDialog;
  41. import com.kongzue.dialogx.dialogs.PopMenu;
  42. import com.kongzue.dialogx.dialogs.PopTip;
  43. import com.kongzue.dialogx.dialogs.TipDialog;
  44. import com.kongzue.dialogx.dialogs.WaitDialog;
  45. import com.kongzue.dialogx.interfaces.BaseDialog;
  46. import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
  47. import com.kongzue.dialogx.interfaces.MenuItemTextInfoInterceptor;
  48. import com.kongzue.dialogx.interfaces.OnBackPressedListener;
  49. import com.kongzue.dialogx.interfaces.OnBindView;
  50. import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
  51. import com.kongzue.dialogx.interfaces.OnIconChangeCallBack;
  52. import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
  53. import com.kongzue.dialogx.interfaces.OnMenuItemClickListener;
  54. import com.kongzue.dialogx.interfaces.OnMenuItemSelectListener;
  55. import com.kongzue.dialogx.style.IOSStyle;
  56. import com.kongzue.dialogx.style.KongzueStyle;
  57. import com.kongzue.dialogx.style.MIUIStyle;
  58. import com.kongzue.dialogx.style.MaterialStyle;
  59. import com.kongzue.dialogx.util.TextInfo;
  60. import com.kongzue.dialogxdemo.BuildConfig;
  61. import com.kongzue.dialogxdemo.R;
  62. import com.kongzue.dialogxdemo.custom.recycleview.CustomRecycleViewAdapter;
  63. import com.kongzue.dialogxdemo.fragment.CustomFragment;
  64. import com.kongzue.dialogxmaterialyou.style.MaterialYouStyle;
  65. import java.util.ArrayList;
  66. import java.util.List;
  67. @Layout(R.layout.activity_main)
  68. @DarkStatusBarTheme(true)
  69. @DarkNavigationBarTheme(true)
  70. @NavigationBarBackgroundColorRes(R.color.emptyNavBar)
  71. public class MainActivity extends BaseActivity {
  72. private ConstraintLayout boxTable;
  73. private TextView txtTitle;
  74. private ImageView btnShare;
  75. private ImageView splitBody;
  76. private LinearLayout boxBody;
  77. private RadioGroup grpMode;
  78. private RadioButton rdoModeView;
  79. private RadioButton rdoModeWindow;
  80. private RadioButton rdoModeDialogFragment;
  81. private RadioButton rdoModeFloatingActivity;
  82. private RadioGroup grpStyle;
  83. private RadioButton rdoMaterial;
  84. private RadioButton rdoIos;
  85. private RadioButton rdoKongzue;
  86. private RadioButton rdoMiui;
  87. private RadioButton rdoMaterialYou;
  88. private RadioGroup grpTheme;
  89. private RadioButton rdoAuto;
  90. private RadioButton rdoLight;
  91. private RadioButton rdoDark;
  92. private TextView btnMessageDialog;
  93. private TextView btnSelectDialog;
  94. private TextView btnInputDialog;
  95. private TextView btnWaitDialog;
  96. private TextView btnWaitAndTipDialog;
  97. private TextView btnTipSuccess;
  98. private TextView btnTipWarning;
  99. private TextView btnTipError;
  100. private TextView btnTipProgress;
  101. private TextView btnPoptip;
  102. private TextView btnPoptipBigMessage;
  103. private TextView btnBottomDialog;
  104. private TextView btnBottomMenu;
  105. private TextView btnBottomReply;
  106. private TextView btnBottomSelectMenu;
  107. private TextView btnBottomMultiSelectMenu;
  108. private TextView btnBottomCustomRecycleView;
  109. private TextView btnCustomMessageDialog;
  110. private TextView btnCustomInputDialog;
  111. private TextView btnCustomBottomMenu;
  112. private TextView btnCustomDialog;
  113. private TextView btnFullScreenDialogWebPage;
  114. private TextView btnFullScreenDialogLogin;
  115. private TextView btnFullScreenDialogFragment;
  116. private TextView btnContextMenu;
  117. private TextView btnSelectMenu;
  118. private TextView btnShowBreak;
  119. private TextView txtVer;
  120. @Override
  121. public void initViews() {
  122. boxTable = findViewById(R.id.box_table);
  123. btnShare = findViewById(R.id.btn_share);
  124. txtTitle = findViewById(R.id.txt_title);
  125. boxBody = findViewById(R.id.box_body);
  126. grpMode = findViewById(R.id.grp_mode);
  127. rdoModeView = findViewById(R.id.rdo_mode_view);
  128. rdoModeWindow = findViewById(R.id.rdo_mode_window);
  129. rdoModeDialogFragment = findViewById(R.id.rdo_mode_dialogFragment);
  130. rdoModeFloatingActivity = findViewById(R.id.rdo_mode_floatingActivity);
  131. grpStyle = findViewById(R.id.grp_style);
  132. rdoMaterial = findViewById(R.id.rdo_material);
  133. rdoIos = findViewById(R.id.rdo_ios);
  134. rdoKongzue = findViewById(R.id.rdo_kongzue);
  135. rdoMiui = findViewById(R.id.rdo_miui);
  136. rdoMaterialYou = findViewById(R.id.rdo_material_you);
  137. grpTheme = findViewById(R.id.grp_theme);
  138. rdoAuto = findViewById(R.id.rdo_auto);
  139. rdoLight = findViewById(R.id.rdo_light);
  140. rdoDark = findViewById(R.id.rdo_dark);
  141. btnMessageDialog = findViewById(R.id.btn_messageDialog);
  142. btnSelectDialog = findViewById(R.id.btn_selectDialog);
  143. btnInputDialog = findViewById(R.id.btn_inputDialog);
  144. btnWaitDialog = findViewById(R.id.btn_waitDialog);
  145. btnWaitAndTipDialog = findViewById(R.id.btn_waitAndTipDialog);
  146. btnTipSuccess = findViewById(R.id.btn_tipSuccess);
  147. btnTipWarning = findViewById(R.id.btn_tipWarning);
  148. btnTipError = findViewById(R.id.btn_tipError);
  149. btnTipProgress = findViewById(R.id.btn_tipProgress);
  150. btnPoptip = findViewById(R.id.btn_poptip);
  151. btnPoptipBigMessage = findViewById(R.id.btn_poptip_bigMessage);
  152. btnBottomDialog = findViewById(R.id.btn_bottom_dialog);
  153. btnBottomMenu = findViewById(R.id.btn_bottom_menu);
  154. btnBottomReply = findViewById(R.id.btn_bottom_reply);
  155. btnBottomSelectMenu = findViewById(R.id.btn_bottom_select_menu);
  156. btnBottomMultiSelectMenu = findViewById(R.id.btn_bottom_multiSelect_menu);
  157. btnBottomCustomRecycleView = findViewById(R.id.btn_bottom_custom_recycleView);
  158. btnCustomMessageDialog = findViewById(R.id.btn_customMessageDialog);
  159. btnCustomInputDialog = findViewById(R.id.btn_customInputDialog);
  160. btnCustomBottomMenu = findViewById(R.id.btn_customBottomMenu);
  161. btnCustomDialog = findViewById(R.id.btn_customDialog);
  162. btnFullScreenDialogWebPage = findViewById(R.id.btn_fullScreenDialog_webPage);
  163. btnFullScreenDialogLogin = findViewById(R.id.btn_fullScreenDialog_login);
  164. btnFullScreenDialogFragment = findViewById(R.id.btn_fullScreenDialog_fragment);
  165. btnContextMenu = findViewById(R.id.btn_contextMenu);
  166. btnSelectMenu = findViewById(R.id.btn_selectMenu);
  167. btnShowBreak = findViewById(R.id.btn_showBreak);
  168. txtVer = findViewById(R.id.txt_ver);
  169. }
  170. @Override
  171. public void initDatas(JumpParameter parameter) {
  172. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  173. refreshUIMode();
  174. boolean showBreak = parameter.getBoolean("showBreak");
  175. if (showBreak) {
  176. txtTitle.setText("显示Dialog时关闭Activity演示");
  177. MessageDialog.show("提示", "接下来会直接运行一个 WaitDialog,2 秒后直接关闭 Activity,并回到原 Activity,保证程序不会出现 WindowLeaked 错误。\n\n" +
  178. "Android 原生 AlertDialog 常出现因 Dialog 先于 Activity 关闭而导致此错误引发程序崩溃。\n\n" +
  179. "而使用 DialogX 构建的对话框不仅仅不会出现此问题,还可避免因句柄持续持有导致的内存泄漏。", "开始测试", "取消")
  180. .setOkButton(new OnDialogButtonClickListener() {
  181. @Override
  182. public boolean onClick(BaseDialog baseDialog, View v) {
  183. WaitDialog.show("请稍后...");
  184. runDelayed(new Runnable() {
  185. @Override
  186. public void run() {
  187. finish(); //先结束掉本界面
  188. }
  189. }, 2000);
  190. return false;
  191. }
  192. })
  193. .setCancelButton(new OnDialogButtonClickListener() {
  194. @Override
  195. public boolean onClick(BaseDialog baseDialog, View v) {
  196. finish();
  197. return false;
  198. }
  199. })
  200. .setCancelable(false);
  201. }
  202. switch (DialogX.implIMPLMode) {
  203. case VIEW:
  204. rdoModeView.setChecked(true);
  205. break;
  206. case WINDOW:
  207. rdoModeWindow.setChecked(true);
  208. break;
  209. case DIALOG_FRAGMENT:
  210. rdoModeDialogFragment.setChecked(true);
  211. break;
  212. case FLOATING_ACTIVITY:
  213. rdoModeFloatingActivity.setChecked(true);
  214. break;
  215. }
  216. txtVer.setText("当前版本:" + BuildConfig.VERSION_NAME);
  217. }
  218. //用于模拟进度提示
  219. private CycleRunner cycleRunner;
  220. private float progress = 0;
  221. private int waitId;
  222. private TextView btnReplyCommit;
  223. private EditText editReplyCommit;
  224. private TextView btnCancel;
  225. private TextView btnSubmit;
  226. private RelativeLayout boxUserName;
  227. private EditText editUserName;
  228. private RelativeLayout boxPassword;
  229. private EditText editPassword;
  230. private TextView btnClose;
  231. private WebView webView;
  232. private String[] singleSelectMenuText = new String[]{"拒绝", "询问", "始终允许", "仅在使用中允许"};
  233. private int selectMenuIndex;
  234. private String[] multiSelectMenuText = new String[]{"上海", "北京", "广州", "深圳"};
  235. private int[] selectMenuIndexArray;
  236. private String multiSelectMenuResultCache;
  237. @Override
  238. public void setEvents() {
  239. grpMode.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  240. @Override
  241. public void onCheckedChanged(RadioGroup group, int checkedId) {
  242. BaseDialog.cleanAll();
  243. switch (checkedId) {
  244. case R.id.rdo_mode_view:
  245. DialogX.implIMPLMode = DialogX.IMPL_MODE.VIEW;
  246. break;
  247. case R.id.rdo_mode_window:
  248. DialogX.implIMPLMode = DialogX.IMPL_MODE.WINDOW;
  249. break;
  250. case R.id.rdo_mode_dialogFragment:
  251. DialogX.implIMPLMode = DialogX.IMPL_MODE.DIALOG_FRAGMENT;
  252. break;
  253. case R.id.rdo_mode_floatingActivity:
  254. DialogX.implIMPLMode = DialogX.IMPL_MODE.FLOATING_ACTIVITY;
  255. break;
  256. }
  257. }
  258. });
  259. grpTheme.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  260. @Override
  261. public void onCheckedChanged(RadioGroup group, int checkedId) {
  262. switch (checkedId) {
  263. case R.id.rdo_auto:
  264. DialogX.globalTheme = DialogX.THEME.AUTO;
  265. break;
  266. case R.id.rdo_light:
  267. DialogX.globalTheme = DialogX.THEME.LIGHT;
  268. break;
  269. case R.id.rdo_dark:
  270. DialogX.globalTheme = DialogX.THEME.DARK;
  271. break;
  272. }
  273. }
  274. });
  275. grpStyle.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  276. @Override
  277. public void onCheckedChanged(RadioGroup group, int checkedId) {
  278. DialogX.cancelButtonText = "取消";
  279. switch (checkedId) {
  280. case R.id.rdo_material:
  281. DialogX.globalStyle = MaterialStyle.style();
  282. DialogX.cancelButtonText = "";
  283. break;
  284. case R.id.rdo_kongzue:
  285. DialogX.globalStyle = KongzueStyle.style();
  286. break;
  287. case R.id.rdo_ios:
  288. DialogX.globalStyle = IOSStyle.style();
  289. break;
  290. case R.id.rdo_miui:
  291. DialogX.globalStyle = MIUIStyle.style();
  292. break;
  293. case R.id.rdo_material_you:
  294. DialogX.globalStyle = MaterialYouStyle.style();
  295. break;
  296. }
  297. }
  298. });
  299. btnShare.setOnClickListener(new View.OnClickListener() {
  300. @Override
  301. public void onClick(View v) {
  302. openUrl("https://github.com/kongzue/DialogX");
  303. }
  304. });
  305. btnContextMenu.setOnClickListener(new View.OnClickListener() {
  306. @Override
  307. public void onClick(View v) {
  308. PopMenu.show(new String[]{"添加", "编辑", "删除", "分享"})
  309. .setOnIconChangeCallBack(new OnIconChangeCallBack<PopMenu>(true) {
  310. @Override
  311. public int getIcon(PopMenu dialog, int index, String menuText) {
  312. switch (index) {
  313. case 0:
  314. return R.mipmap.img_dialogx_demo_add;
  315. case 1:
  316. return R.mipmap.img_dialogx_demo_edit;
  317. case 2:
  318. return R.mipmap.img_dialogx_demo_delete;
  319. case 3:
  320. return R.mipmap.img_dialogx_demo_share;
  321. default:
  322. return 0;
  323. }
  324. }
  325. });
  326. }
  327. });
  328. btnSelectMenu.setOnClickListener(new View.OnClickListener() {
  329. @Override
  330. public void onClick(View view) {
  331. PopMenu.show(view, new String[]{"选项1", "选项2", "选项3"})
  332. .setOnMenuItemClickListener(new OnMenuItemClickListener<PopMenu>() {
  333. @Override
  334. public boolean onClick(PopMenu dialog, CharSequence text, int index) {
  335. btnSelectMenu.setText(text);
  336. return false;
  337. }
  338. });
  339. }
  340. });
  341. btnFullScreenDialogFragment.setOnClickListener(new View.OnClickListener() {
  342. @Override
  343. public void onClick(View v) {
  344. CustomFragment customFragment = new CustomFragment();
  345. FullScreenDialog.show(new OnBindView<FullScreenDialog>(customFragment) {
  346. @Override
  347. public void onBind(FullScreenDialog dialog, View v) {
  348. }
  349. });
  350. }
  351. });
  352. btnMessageDialog.setOnClickListener(new View.OnClickListener() {
  353. @Override
  354. public void onClick(View view) {
  355. MessageDialog.show("标题", "这里是正文内容。", "确定").setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
  356. @Override
  357. public boolean onClick(MessageDialog baseDialog, View v) {
  358. PopTip.show("点击确定按钮");
  359. return false;
  360. }
  361. });
  362. }
  363. });
  364. btnSelectDialog.setOnClickListener(new View.OnClickListener() {
  365. @Override
  366. public void onClick(View v) {
  367. MessageDialog messageDialog = new MessageDialog("多选对话框", "移除App会将它从主屏幕移除并保留其所有数据。", "删除App", "取消", "移至App资源库")
  368. .setButtonOrientation(LinearLayout.VERTICAL);
  369. if (!rdoMiui.isChecked()) {
  370. messageDialog.setOkTextInfo(new TextInfo().setFontColor(Color.parseColor("#EB5545")).setBold(true));
  371. }
  372. messageDialog.show();
  373. }
  374. });
  375. btnInputDialog.setOnClickListener(new View.OnClickListener() {
  376. @Override
  377. public void onClick(View view) {
  378. new InputDialog("标题", "正文内容", "确定", "取消", "正在输入的文字")
  379. .setInputText("Hello World")
  380. .setCancelable(false)
  381. .setOkButton(new OnInputDialogButtonClickListener<InputDialog>() {
  382. @Override
  383. public boolean onClick(InputDialog baseDialog, View v, String inputStr) {
  384. PopTip.show("输入的内容:" + inputStr);
  385. return false;
  386. }
  387. })
  388. .show();
  389. }
  390. });
  391. btnWaitDialog.setOnClickListener(new View.OnClickListener() {
  392. @Override
  393. public void onClick(View v) {
  394. WaitDialog.show("Please Wait!").setOnBackPressedListener(new OnBackPressedListener() {
  395. @Override
  396. public boolean onBackPressed() {
  397. PopTip.show("按下返回");
  398. return false;
  399. }
  400. });
  401. runDelayed(new Runnable() {
  402. @Override
  403. public void run() {
  404. WaitDialog.dismiss();
  405. }
  406. }, 2000);
  407. }
  408. });
  409. btnWaitAndTipDialog.setOnClickListener(new View.OnClickListener() {
  410. boolean closeFlag = false;
  411. @Override
  412. public void onClick(View v) {
  413. closeFlag = false;
  414. WaitDialog.show("Please Wait!").setOnBackPressedListener(new OnBackPressedListener() {
  415. @Override
  416. public boolean onBackPressed() {
  417. PopTip.show("按下返回", "关闭").setButton(new OnDialogButtonClickListener<PopTip>() {
  418. @Override
  419. public boolean onClick(PopTip baseDialog, View v) {
  420. closeFlag = true;
  421. WaitDialog.dismiss();
  422. return false;
  423. }
  424. });
  425. return false;
  426. }
  427. });
  428. if (!closeFlag) runDelayed(new Runnable() {
  429. @Override
  430. public void run() {
  431. if (!closeFlag) TipDialog.show("完成!", WaitDialog.TYPE.SUCCESS);
  432. }
  433. }, 2000);
  434. }
  435. });
  436. btnTipSuccess.setOnClickListener(new View.OnClickListener() {
  437. @Override
  438. public void onClick(View v) {
  439. TipDialog.show("Success!", WaitDialog.TYPE.SUCCESS);
  440. }
  441. });
  442. btnTipWarning.setOnClickListener(new View.OnClickListener() {
  443. @Override
  444. public void onClick(View v) {
  445. TipDialog.show("Warning!", WaitDialog.TYPE.WARNING);
  446. }
  447. });
  448. btnTipError.setOnClickListener(new View.OnClickListener() {
  449. @Override
  450. public void onClick(View v) {
  451. TipDialog.show("Error!", WaitDialog.TYPE.ERROR);
  452. }
  453. });
  454. btnTipProgress.setOnClickListener(new View.OnClickListener() {
  455. @Override
  456. public void onClick(View v) {
  457. waitId = 0;
  458. progress = 0;
  459. WaitDialog.show("假装连接...").setOnBackPressedListener(new OnBackPressedListener() {
  460. @Override
  461. public boolean onBackPressed() {
  462. MessageDialog.show("正在进行", "是否取消?", "是", "否").setOkButton(new OnDialogButtonClickListener() {
  463. @Override
  464. public boolean onClick(BaseDialog baseDialog, View v) {
  465. waitId = -1;
  466. WaitDialog.dismiss();
  467. return false;
  468. }
  469. });
  470. return false;
  471. }
  472. });
  473. runOnMainDelayed(new Runnable() {
  474. @Override
  475. public void run() {
  476. if (waitId != 0) {
  477. return;
  478. }
  479. cycleRunner = runOnMainCycle(new Runnable() {
  480. @Override
  481. public void run() {
  482. if (waitId != 0) {
  483. cycleRunner.cancel();
  484. return;
  485. }
  486. progress = progress + 0.1f;
  487. if (progress < 1f) {
  488. WaitDialog.show("假装加载" + ((int) (progress * 100)) + "%", progress);
  489. } else {
  490. TipDialog.show("加载完成", WaitDialog.TYPE.SUCCESS);
  491. cycleRunner.cancel();
  492. }
  493. }
  494. }, 1000, 1000);
  495. }
  496. }, 3000);
  497. }
  498. });
  499. btnBottomDialog.setOnClickListener(new View.OnClickListener() {
  500. @Override
  501. public void onClick(View v) {
  502. String s = rdoMaterial.isChecked() ? "你可以向下滑动来关闭这个对话框" : "你可以点击空白区域或返回键来关闭这个对话框";
  503. new BottomDialog("标题", "这里是对话框内容。\n" + s + "。\n底部对话框也支持自定义布局扩展使用方式。",
  504. new OnBindView<BottomDialog>(R.layout.layout_custom_view) {
  505. @Override
  506. public void onBind(BottomDialog dialog, View v) {
  507. if (dialog.getDialogImpl().imgTab != null) {
  508. ((ViewGroup) dialog.getDialogImpl().imgTab.getParent()).removeView(dialog.getDialogImpl().imgTab);
  509. }
  510. v.setOnClickListener(new View.OnClickListener() {
  511. @Override
  512. public void onClick(View v) {
  513. dialog.dismiss();
  514. PopTip.show("Click Custom View");
  515. }
  516. });
  517. }
  518. })
  519. .show();
  520. }
  521. });
  522. btnBottomMenu.setOnClickListener(new View.OnClickListener() {
  523. @Override
  524. public void onClick(View v) {
  525. if (rdoMaterial.isChecked()) {
  526. //Material 可滑动展开 BottomMenu 演示
  527. //因数据量大,尝试异步线程启动
  528. new Thread() {
  529. @Override
  530. public void run() {
  531. super.run();
  532. BottomMenu.build()
  533. .setBottomDialogMaxHeight(0.6f)
  534. .setMenuList(new String[]{"添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐", "添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐"})
  535. .setOnIconChangeCallBack(new OnIconChangeCallBack<BottomMenu>(true) {
  536. @Override
  537. public int getIcon(BottomMenu bottomMenu, int index, String menuText) {
  538. switch (menuText) {
  539. case "添加":
  540. return R.mipmap.img_dialogx_demo_add;
  541. case "查看":
  542. return R.mipmap.img_dialogx_demo_view;
  543. case "编辑":
  544. return R.mipmap.img_dialogx_demo_edit;
  545. case "删除":
  546. return R.mipmap.img_dialogx_demo_delete;
  547. case "分享":
  548. return R.mipmap.img_dialogx_demo_share;
  549. case "评论":
  550. return R.mipmap.img_dialogx_demo_comment;
  551. case "下载":
  552. return R.mipmap.img_dialogx_demo_download;
  553. case "收藏":
  554. return R.mipmap.img_dialogx_demo_favorite;
  555. case "赞!":
  556. return R.mipmap.img_dialogx_demo_good;
  557. case "不喜欢":
  558. return R.mipmap.img_dialogx_demo_dislike;
  559. case "所属专辑":
  560. return R.mipmap.img_dialogx_demo_album;
  561. case "复制链接":
  562. return R.mipmap.img_dialogx_demo_link;
  563. case "类似推荐":
  564. return R.mipmap.img_dialogx_demo_recommend;
  565. }
  566. return 0;
  567. }
  568. })
  569. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  570. @Override
  571. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  572. PopTip.show(text);
  573. return false;
  574. }
  575. })
  576. .show();
  577. }
  578. }.start();
  579. } else {
  580. BottomMenu.show(new String[]{"新标签页中打开", "稍后阅读", "复制链接网址"})
  581. .setMessage("http://www.kongzue.com/DialogX")
  582. .setMenuItemTextInfoInterceptor(new MenuItemTextInfoInterceptor<BottomMenu>() {
  583. @Override
  584. public TextInfo menuItemTextInfo(BottomMenu dialog, int index, String menuText) {
  585. if (index == 2) {
  586. return new TextInfo()
  587. .setFontColor(Color.RED)
  588. .setBold(true);
  589. }
  590. return null;
  591. }
  592. })
  593. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  594. @Override
  595. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  596. PopTip.show(text);
  597. return false;
  598. }
  599. });
  600. }
  601. }
  602. });
  603. btnBottomReply.setOnClickListener(new View.OnClickListener() {
  604. @Override
  605. public void onClick(View v) {
  606. BottomDialog.show(new OnBindView<BottomDialog>(rdoDark.isChecked() ? R.layout.layout_custom_reply_dark : R.layout.layout_custom_reply) {
  607. @Override
  608. public void onBind(final BottomDialog dialog, View v) {
  609. btnReplyCommit = v.findViewById(R.id.btn_reply_commit);
  610. editReplyCommit = v.findViewById(R.id.edit_reply_commit);
  611. btnReplyCommit.setOnClickListener(new View.OnClickListener() {
  612. @Override
  613. public void onClick(View v) {
  614. dialog.dismiss();
  615. PopTip.show("提交内容:\n" + editReplyCommit.getText().toString());
  616. }
  617. });
  618. editReplyCommit.postDelayed(new Runnable() {
  619. @Override
  620. public void run() {
  621. showIME(editReplyCommit);
  622. }
  623. }, 300);
  624. }
  625. }).setAllowInterceptTouch(false);
  626. }
  627. });
  628. btnCustomMessageDialog.setOnClickListener(new View.OnClickListener() {
  629. @Override
  630. public void onClick(View v) {
  631. MessageDialog.show("这里是标题", "此对话框演示的是自定义对话框内部布局的效果", "确定", "取消")
  632. .setCustomView(new OnBindView<MessageDialog>(R.layout.layout_custom_view) {
  633. @Override
  634. public void onBind(MessageDialog dialog, View v) {
  635. }
  636. });
  637. }
  638. });
  639. btnCustomInputDialog.setOnClickListener(new View.OnClickListener() {
  640. @Override
  641. public void onClick(View v) {
  642. InputDialog.show("这里是标题", "此对话框演示的是自定义对话框内部布局的效果", "确定", "取消")
  643. .setCustomView(new OnBindView<MessageDialog>(R.layout.layout_custom_view) {
  644. @Override
  645. public void onBind(MessageDialog dialog, View v) {
  646. }
  647. });
  648. }
  649. });
  650. btnCustomBottomMenu.setOnClickListener(new View.OnClickListener() {
  651. @Override
  652. public void onClick(View v) {
  653. BottomMenu.show(new String[]{"新标签页中打开", "稍后阅读", "复制链接网址"})
  654. .setMessage("http://www.kongzue.com/DialogX")
  655. .setOnMenuItemClickListener(new OnMenuItemClickListener<BottomMenu>() {
  656. @Override
  657. public boolean onClick(BottomMenu dialog, CharSequence text, int index) {
  658. PopTip.show(text);
  659. return false;
  660. }
  661. })
  662. .setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_view) {
  663. @Override
  664. public void onBind(BottomDialog dialog, View v) {
  665. }
  666. });
  667. }
  668. });
  669. btnShowBreak.setOnClickListener(new View.OnClickListener() {
  670. @Override
  671. public void onClick(View v) {
  672. jump(MainActivity.class, new JumpParameter().put("showBreak", true).put("fromActivity", getInstanceKey()));
  673. }
  674. });
  675. btnFullScreenDialogLogin.setOnClickListener(new View.OnClickListener() {
  676. /**
  677. * 采用异步加载布局防止卡顿测试
  678. */
  679. OnBindView<FullScreenDialog> onBindView;
  680. @Override
  681. public void onClick(View v) {
  682. onBindView = new OnBindView<FullScreenDialog>(R.layout.layout_full_login) {
  683. @Override
  684. public void onBind(FullScreenDialog dialog, View v) {
  685. btnCancel = v.findViewById(R.id.btn_cancel);
  686. btnSubmit = v.findViewById(R.id.btn_submit);
  687. boxUserName = v.findViewById(R.id.box_userName);
  688. editUserName = v.findViewById(R.id.edit_userName);
  689. boxPassword = v.findViewById(R.id.box_password);
  690. editPassword = v.findViewById(R.id.edit_password);
  691. initFullScreenLoginDemo(dialog);
  692. }
  693. };
  694. FullScreenDialog.show(onBindView);
  695. }
  696. });
  697. btnFullScreenDialogWebPage.setOnClickListener(new View.OnClickListener() {
  698. @Override
  699. public void onClick(View v) {
  700. FullScreenDialog.show(new OnBindView<FullScreenDialog>(R.layout.layout_full_webview) {
  701. @Override
  702. public void onBind(final FullScreenDialog dialog, View v) {
  703. btnClose = v.findViewById(R.id.btn_close);
  704. webView = v.findViewById(R.id.webView);
  705. btnClose.setOnClickListener(new View.OnClickListener() {
  706. @Override
  707. public void onClick(View v) {
  708. dialog.dismiss();
  709. }
  710. });
  711. WebSettings webSettings = webView.getSettings();
  712. webSettings.setJavaScriptEnabled(true);
  713. webSettings.setLoadWithOverviewMode(true);
  714. webSettings.setUseWideViewPort(true);
  715. webSettings.setSupportZoom(false);
  716. webSettings.setAllowFileAccess(true);
  717. webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
  718. webSettings.setLoadsImagesAutomatically(true);
  719. webSettings.setDefaultTextEncodingName("utf-8");
  720. webView.setWebViewClient(new WebViewClient() {
  721. @Override
  722. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  723. try {
  724. Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  725. startActivity(intent);
  726. } catch (ActivityNotFoundException e) {
  727. e.printStackTrace();
  728. }
  729. return true;
  730. }
  731. @Override
  732. public void onPageFinished(WebView view, String url) {
  733. super.onPageFinished(view, url);
  734. }
  735. });
  736. webView.loadUrl("https://github.com/kongzue/DialogX");
  737. }
  738. });
  739. }
  740. });
  741. btnCustomDialog.setOnClickListener(new View.OnClickListener() {
  742. @Override
  743. public void onClick(View v) {
  744. CustomDialog.show(new OnBindView<CustomDialog>(R.layout.layout_custom_dialog) {
  745. @Override
  746. public void onBind(final CustomDialog dialog, View v) {
  747. ImageView btnOk;
  748. btnOk = v.findViewById(R.id.btn_ok);
  749. btnOk.setOnClickListener(new View.OnClickListener() {
  750. @Override
  751. public void onClick(View v) {
  752. dialog.dismiss();
  753. }
  754. });
  755. }
  756. })
  757. .setMaskColor(getResources().getColor(R.color.black30));
  758. }
  759. });
  760. btnPoptip.setOnClickListener(new View.OnClickListener() {
  761. @Override
  762. public void onClick(View v) {
  763. PopTip.show("这是一个提示");
  764. }
  765. });
  766. btnPoptipBigMessage.setOnClickListener(new View.OnClickListener() {
  767. @Override
  768. public void onClick(View v) {
  769. if (rdoIos.isChecked()) {
  770. PopTip.show(R.mipmap.img_air_pods_pro, "AirPods Pro 已连接").setAutoTintIconInLightOrDarkMode(false).showLong();
  771. } else {
  772. PopTip.show(R.mipmap.img_mail_line_white, "邮件已发送", "撤回").setButton(new OnDialogButtonClickListener<PopTip>() {
  773. @Override
  774. public boolean onClick(PopTip popTip, View v) {
  775. //点击“撤回”按钮回调
  776. toast("邮件已撤回");
  777. return false;
  778. }
  779. }).showLong();
  780. }
  781. }
  782. });
  783. btnBottomSelectMenu.setOnClickListener(new View.OnClickListener() {
  784. @Override
  785. public void onClick(View v) {
  786. BottomMenu.show(singleSelectMenuText)
  787. .setMessage("这里是权限确认的文本说明,这是一个演示菜单")
  788. .setTitle("获得权限标题")
  789. .setOnMenuItemClickListener(new OnMenuItemSelectListener<BottomMenu>() {
  790. @Override
  791. public void onOneItemSelect(BottomMenu dialog, CharSequence text, int index, boolean select) {
  792. selectMenuIndex = index;
  793. }
  794. })
  795. .setCancelButton("确定", new OnDialogButtonClickListener<BottomDialog>() {
  796. @Override
  797. public boolean onClick(BottomDialog baseDialog, View v) {
  798. PopTip.show("已选择:" + singleSelectMenuText[selectMenuIndex]);
  799. return false;
  800. }
  801. })
  802. .setSelection(selectMenuIndex);
  803. }
  804. });
  805. btnBottomMultiSelectMenu.setOnClickListener(new View.OnClickListener() {
  806. @Override
  807. public void onClick(View v) {
  808. BottomMenu.show(multiSelectMenuText)
  809. .setMessage("这里是权限确认的文本说明,这是一个演示菜单")
  810. .setTitle("获得权限标题")
  811. .setOnMenuItemClickListener(new OnMenuItemSelectListener<BottomMenu>() {
  812. @Override
  813. public void onMultiItemSelect(BottomMenu dialog, CharSequence[] text, int[] index) {
  814. multiSelectMenuResultCache = "";
  815. for (CharSequence c : text) {
  816. multiSelectMenuResultCache = multiSelectMenuResultCache + " " + c;
  817. }
  818. selectMenuIndexArray = index;
  819. }
  820. })
  821. .setCancelButton("确定", new OnDialogButtonClickListener<BottomDialog>() {
  822. @Override
  823. public boolean onClick(BottomDialog baseDialog, View v) {
  824. PopTip.show("已选择:" + multiSelectMenuResultCache);
  825. return false;
  826. }
  827. })
  828. .setSelection(selectMenuIndexArray);
  829. }
  830. });
  831. btnBottomCustomRecycleView.setOnClickListener(new View.OnClickListener() {
  832. @Override
  833. public void onClick(View v) {
  834. BottomDialog.build()
  835. .setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_recycleview) {
  836. @Override
  837. public void onBind(BottomDialog dialog, View v) {
  838. List<CustomRecycleViewAdapter.Data> fruitList = new ArrayList<>();
  839. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 1"));
  840. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 2"));
  841. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 3"));
  842. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 4"));
  843. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 5"));
  844. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 6"));
  845. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 7"));
  846. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 8"));
  847. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 9"));
  848. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 10"));
  849. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 11"));
  850. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 12"));
  851. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 13"));
  852. fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 14"));
  853. RecyclerView recyclerView = (RecyclerView) v;
  854. LinearLayoutManager layoutManager = new LinearLayoutManager(me);
  855. recyclerView.setLayoutManager(layoutManager);
  856. CustomRecycleViewAdapter adapter = new CustomRecycleViewAdapter(fruitList);
  857. recyclerView.setAdapter(adapter);
  858. }
  859. })
  860. .show();
  861. }
  862. });
  863. }
  864. private void initFullScreenLoginDemo(final FullScreenDialog fullScreenDialog) {
  865. btnCancel.setOnClickListener(new View.OnClickListener() {
  866. @Override
  867. public void onClick(View v) {
  868. fullScreenDialog.dismiss();
  869. }
  870. });
  871. btnCancel.setText("取消");
  872. btnSubmit.setText("下一步");
  873. btnSubmit.setOnClickListener(new View.OnClickListener() {
  874. @Override
  875. public void onClick(View v) {
  876. if (isNull(editUserName.getText().toString().trim())) {
  877. hideIME(null);
  878. TipDialog.show("请输入账号", TipDialog.TYPE.WARNING);
  879. return;
  880. }
  881. boxUserName.animate().x(-getDisplayWidth()).setDuration(300);
  882. boxPassword.setX(getDisplayWidth());
  883. boxPassword.setVisibility(View.VISIBLE);
  884. boxPassword.animate().x(0).setDuration(300);
  885. editPassword.setFocusable(true);
  886. editPassword.requestFocus();
  887. btnCancel.setText("上一步");
  888. btnCancel.setOnClickListener(new View.OnClickListener() {
  889. @Override
  890. public void onClick(View v) {
  891. boxUserName.animate().x(0).setDuration(300);
  892. boxPassword.animate().x(getDisplayWidth()).setDuration(300);
  893. editUserName.setFocusable(true);
  894. editUserName.requestFocus();
  895. initFullScreenLoginDemo(fullScreenDialog);
  896. }
  897. });
  898. btnSubmit.setText("登录");
  899. btnSubmit.setOnClickListener(new View.OnClickListener() {
  900. @Override
  901. public void onClick(View v) {
  902. hideIME(null);
  903. if (isNull(editPassword.getText().toString().trim())) {
  904. TipDialog.show("请输入密码", TipDialog.TYPE.WARNING);
  905. return;
  906. }
  907. WaitDialog.show("登录中...");
  908. runOnMainDelayed(new Runnable() {
  909. @Override
  910. public void run() {
  911. TipDialog.show("登录成功", TipDialog.TYPE.SUCCESS).setDialogLifecycleCallback(new DialogLifecycleCallback<WaitDialog>() {
  912. @Override
  913. public void onDismiss(WaitDialog dialog) {
  914. fullScreenDialog.dismiss();
  915. }
  916. });
  917. }
  918. }, 2000);
  919. }
  920. });
  921. }
  922. });
  923. }
  924. @Override
  925. public void onBackPressed() {
  926. log("#MainActivity.onBackPressed");
  927. super.onBackPressed();
  928. }
  929. public void showIME(EditText editText) {
  930. if (editText == null) {
  931. return;
  932. }
  933. editText.requestFocus();
  934. editText.setFocusableInTouchMode(true);
  935. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  936. imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
  937. }
  938. @Override
  939. public void onConfigurationChanged(@NonNull Configuration newConfig) {
  940. super.onConfigurationChanged(newConfig);
  941. refreshUIMode();
  942. }
  943. /**
  944. * 刷新亮暗色模式界面变化
  945. */
  946. private void refreshUIMode() {
  947. if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO) {
  948. setDarkStatusBarTheme(true);
  949. } else {
  950. setDarkStatusBarTheme(false);
  951. }
  952. }
  953. }