当前位置:   article > 正文

使用Activity实现dialog效果(并解决输入框在软键盘顶部方法)_android fragmentdialog中软键盘高度获取总为0

android fragmentdialog中软键盘高度获取总为0

说明:公司的需求是要在底部弹框中增加一个输入框,并且最底部分是时间选择器,点击编辑框时,遮挡住时间选择框布局

使用fragmentDialog无法控制输入框

 1、在styles中设置Activity的弹框主题以及弹出的动画样式

  1. <!--ActivityDialog底部弹出样式 start-->
  2. <style name="ActivityDialogTheme">
  3. <item name="android:windowBackground">@android:color/transparent
  4. </item> <!--设置dialog的背景,此处为系统给定的透明值-->
  5. <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框为无-->
  6. <item name="android:windowNoTitle">true</item>         <!--是否显示标题-->
  7. <item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上-->
  8. <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
  9. <item name="android:windowContentOverlay">@null</item> <!--是否有覆盖-->
  10. <item name="android:windowAnimationStyle">@style/AnimationActivity
  11. </item> <!--设置Activity出现方式-->
  12. <item name="android:backgroundDimEnabled">true</item> <!--背景是否模糊显示-->
  13. <item name="android:windowTranslucentStatus">true</item> <!-- 设置背景透明色-->
  14. <item name="android:windowTranslucentNavigation">true</item>
  15. </style>
  16. //弹出动画样式
  17. <!--从底部弹出的动画样式-->
  18. <style name="AnimationActivity" mce_bogus="1" parent="@android:style/Animation.Activity">
  19. <!--一个activity创建进入的效果。-->
  20. <item name="android:activityOpenEnterAnimation">@anim/slide_in_bottom</item>
  21. <!--一个activity还没有finish()下退出效果, 比如有俩个activity A与B 首先启动A 然后再启动B 那么A还没有finish() 这时A的退出效果。-->
  22. <item name="android:activityOpenExitAnimation">@anim/slide_out_bottom</item>
  23. <!--表示上一个activity返回进入效果 比如有俩个activity A与B B在最上面,B退出(finish)后 A重新进入的效果。-->
  24. <item name="android:activityCloseEnterAnimation">@anim/slide_in_bottom</item>
  25. <!--表示的是activity finish()之后的效果 比如有俩个activity A与B B退出后会被finish() 那么B的退出效果在这定义。-->
  26. <item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
  27. </style>

2、退出和进入动画布局

(1)放在res文件下,创建anim文件并创建slide_out_bottom.xml 退出动画布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration="300"
  5. android:fromYDelta="0%"
  6. android:startOffset="0"
  7. android:toYDelta="100%" />
  8. </set>

(2)创建slide_out_bottom 进入动画布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration="300"
  5. android:fromYDelta="100%"
  6. android:startOffset="0"
  7. android:toYDelta="0%" />
  8. </set>

3、代码部分

java代码,主要是启动动画

  1. //定义Activity退出动画的成员变量
  2. protected int activityCloseEnterAnimation;
  3. protected int activityCloseExitAnimation;
  4. //在onCreate方法中初始化
  5. TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[]{android.R.attr.windowAnimationStyle});
  6. int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
  7. activityStyle.recycle();
  8. activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[]{android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
  9. activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
  10. activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
  11. activityStyle.recycle();
  12. //重写finish方法
  13. @Override
  14. public void finish() {
  15. super.finish();
  16. //finish时调用退出动画
  17. overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
  18. }

(1)在androidmanifest.xml设置主题

  1. <activity
  2. android:name=".ui.dialog.MinePetTimeActivityDialog"
  3. android:theme="@style/ActivityDialogTheme"
  4. android:windowSoftInputMode="adjustResize|stateHidden" />
  5. <activity

完整java代码

  1. public class MinePetTimeActivityDialog extends Activity implements View.OnClickListener {
  2. @BindView(R.id.rl)
  3. LinearLayout relativeLayout;
  4. @BindView(R.id.tv_title)
  5. TextView tvTitle;
  6. @BindView(R.id.tv_cancel)
  7. TextView tvCancel;
  8. @BindView(R.id.tv_time)
  9. TextView tvTime;
  10. @BindView(R.id.tv_confirm)
  11. TextView tvConfirm;
  12. @BindView(R.id.tv_date)
  13. TextView tvDate;
  14. @BindView(R.id.tv_bei_zhu)
  15. TextView tvBeiZhu;
  16. @BindView(R.id.et_bei_zhu)
  17. EditText etBeiZhu;
  18. @BindView(R.id.fragment)
  19. FrameLayout fragment;
  20. @BindView(R.id.rl_date)
  21. RelativeLayout rlDate;
  22. @BindView(R.id.rl_bei_zhu)
  23. RelativeLayout rlBeiZhu;
  24. @BindView(R.id.v)
  25. View v;
  26. //定义Activity退出动画的成员变量
  27. protected int activityCloseEnterAnimation;
  28. protected int activityCloseExitAnimation;
  29. private Context mContext;
  30. private TimePickerView pvTime;
  31. private long time = System.currentTimeMillis();
  32. private String mType = "";
  33. private int mPetId;
  34. private boolean isNotes;
  35. private PetHealthNoteBean.DataBean.ContentBean bean;
  36. private boolean isRemindToNotes;
  37. private PetHealthRemindBean.DataBean beanHealth;
  38. private boolean isSelect;
  39. @Override
  40. public void onCreate(@Nullable Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. mContext = this;
  43. setContentView(R.layout.activity_mine_pet_time_dialog);
  44. getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
  45. ButterKnife.bind(this);
  46. initView();
  47. initTransferData();
  48. initListener();
  49. }
  50. @Override
  51. protected void onStart() {
  52. super.onStart();
  53. if (isSelect) {
  54. etBeiZhu.setFocusable(true);
  55. etBeiZhu.requestFocus();
  56. etBeiZhu.setFocusableInTouchMode(true);
  57. InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
  58. imm.showSoftInput(etBeiZhu, InputMethodManager.SHOW_IMPLICIT);
  59. }
  60. Window window = getWindow();
  61. WindowManager.LayoutParams windowParams = window.getAttributes();
  62. windowParams.dimAmount = 0.5f;//设置灰度.
  63. window.setAttributes(windowParams);
  64. }
  65. private void initView() {
  66. TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[]{android.R.attr.windowAnimationStyle});
  67. int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
  68. activityStyle.recycle();
  69. activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[]{android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
  70. activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
  71. activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
  72. activityStyle.recycle();
  73. //设置布局在底部
  74. getWindow().setGravity(Gravity.BOTTOM);
  75. //设置布局填充满宽度
  76. WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
  77. layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
  78. getWindow().setAttributes(layoutParams);
  79. initTimePicker();
  80. setYiMiaoTextColor(1);
  81. tvTime.setText(DateUtils.getStringDateYMD());
  82. }
  83. @SuppressLint("ClickableViewAccessibility")
  84. private void initListener() {
  85. relativeLayout.setOnClickListener(this);
  86. rlDate.setOnClickListener(this);
  87. tvCancel.setOnClickListener(this);
  88. tvConfirm.setOnClickListener(this);
  89. }
  90. //重写finish方法
  91. @Override
  92. public void finish() {
  93. super.finish();
  94. //finish时调用退出动画
  95. overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
  96. }
  97. @Override
  98. protected void onDestroy() {
  99. mType = "";
  100. mPetId = 0;
  101. isNotes = false;
  102. bean = null;
  103. super.onDestroy();
  104. }
  105. }

 4、解决软件问题

思路:使用 SoftKeyBoardListener工具类监听软件是否弹出,然后根据软件盘的高度进行设置

  1. private void initKeyBoard() {
  2. SoftKeyBoardListener.setListener(this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
  3. @Override
  4. public void keyBoardShow(int height) {
  5. LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams();
  6. layoutParams.height = height - fragment.getHeight();//fragment.getHeight()输入框下的那个高度
  7. v.setLayoutParams(layoutParams);
  8. }
  9. @Override
  10. public void keyBoardHide(int height) {
  11. LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams();
  12. layoutParams.height = 0;
  13. v.setLayoutParams(layoutParams);
  14. }
  15. });
  16. }

效果图

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号