1
0

MainActivity.java 79 KB

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