赞
踩
说明:公司的需求是要在底部弹框中增加一个输入框,并且最底部分是时间选择器,点击编辑框时,遮挡住时间选择框布局
使用fragmentDialog无法控制输入框
1、在styles中设置Activity的弹框主题以及弹出的动画样式
- <!--ActivityDialog底部弹出样式 start-->
- <style name="ActivityDialogTheme">
- <item name="android:windowBackground">@android:color/transparent
- </item> <!--设置dialog的背景,此处为系统给定的透明值-->
- <item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框为无-->
- <item name="android:windowNoTitle">true</item> <!--是否显示标题-->
- <item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上-->
- <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
- <item name="android:windowContentOverlay">@null</item> <!--是否有覆盖-->
- <item name="android:windowAnimationStyle">@style/AnimationActivity
- </item> <!--设置Activity出现方式-->
- <item name="android:backgroundDimEnabled">true</item> <!--背景是否模糊显示-->
- <item name="android:windowTranslucentStatus">true</item> <!-- 设置背景透明色-->
- <item name="android:windowTranslucentNavigation">true</item>
- </style>
-
- //弹出动画样式
-
- <!--从底部弹出的动画样式-->
- <style name="AnimationActivity" mce_bogus="1" parent="@android:style/Animation.Activity">
- <!--一个activity创建进入的效果。-->
- <item name="android:activityOpenEnterAnimation">@anim/slide_in_bottom</item>
- <!--一个activity还没有finish()下退出效果, 比如有俩个activity A与B 首先启动A 然后再启动B 那么A还没有finish() 这时A的退出效果。-->
- <item name="android:activityOpenExitAnimation">@anim/slide_out_bottom</item>
- <!--表示上一个activity返回进入效果 比如有俩个activity A与B B在最上面,B退出(finish)后 A重新进入的效果。-->
- <item name="android:activityCloseEnterAnimation">@anim/slide_in_bottom</item>
- <!--表示的是activity finish()之后的效果 比如有俩个activity A与B B退出后会被finish() 那么B的退出效果在这定义。-->
- <item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
- </style>
2、退出和进入动画布局
(1)放在res文件下,创建anim文件并创建slide_out_bottom.xml 退出动画布局
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate
- android:duration="300"
- android:fromYDelta="0%"
- android:startOffset="0"
- android:toYDelta="100%" />
- </set>
(2)创建slide_out_bottom 进入动画布局
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate
- android:duration="300"
- android:fromYDelta="100%"
- android:startOffset="0"
- android:toYDelta="0%" />
- </set>
3、代码部分
java代码,主要是启动动画
- //定义Activity退出动画的成员变量
- protected int activityCloseEnterAnimation;
- protected int activityCloseExitAnimation;
-
-
-
-
-
- //在onCreate方法中初始化
- TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[]{android.R.attr.windowAnimationStyle});
- int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
- activityStyle.recycle();
- activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[]{android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
- activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
- activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
- activityStyle.recycle();
-
-
-
- //重写finish方法
- @Override
- public void finish() {
- super.finish();
- //finish时调用退出动画
- overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
- }
(1)在androidmanifest.xml设置主题
- <activity
- android:name=".ui.dialog.MinePetTimeActivityDialog"
- android:theme="@style/ActivityDialogTheme"
- android:windowSoftInputMode="adjustResize|stateHidden" />
- <activity
完整java代码
- public class MinePetTimeActivityDialog extends Activity implements View.OnClickListener {
- @BindView(R.id.rl)
- LinearLayout relativeLayout;
- @BindView(R.id.tv_title)
- TextView tvTitle;
- @BindView(R.id.tv_cancel)
- TextView tvCancel;
- @BindView(R.id.tv_time)
- TextView tvTime;
- @BindView(R.id.tv_confirm)
- TextView tvConfirm;
- @BindView(R.id.tv_date)
- TextView tvDate;
- @BindView(R.id.tv_bei_zhu)
- TextView tvBeiZhu;
- @BindView(R.id.et_bei_zhu)
- EditText etBeiZhu;
- @BindView(R.id.fragment)
- FrameLayout fragment;
-
- @BindView(R.id.rl_date)
- RelativeLayout rlDate;
- @BindView(R.id.rl_bei_zhu)
- RelativeLayout rlBeiZhu;
- @BindView(R.id.v)
- View v;
-
-
- //定义Activity退出动画的成员变量
- protected int activityCloseEnterAnimation;
- protected int activityCloseExitAnimation;
- private Context mContext;
- private TimePickerView pvTime;
- private long time = System.currentTimeMillis();
- private String mType = "";
- private int mPetId;
- private boolean isNotes;
- private PetHealthNoteBean.DataBean.ContentBean bean;
- private boolean isRemindToNotes;
- private PetHealthRemindBean.DataBean beanHealth;
- private boolean isSelect;
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mContext = this;
- setContentView(R.layout.activity_mine_pet_time_dialog);
- getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
- ButterKnife.bind(this);
- initView();
- initTransferData();
- initListener();
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- if (isSelect) {
- etBeiZhu.setFocusable(true);
- etBeiZhu.requestFocus();
- etBeiZhu.setFocusableInTouchMode(true);
- InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
- imm.showSoftInput(etBeiZhu, InputMethodManager.SHOW_IMPLICIT);
- }
- Window window = getWindow();
- WindowManager.LayoutParams windowParams = window.getAttributes();
- windowParams.dimAmount = 0.5f;//设置灰度.
- window.setAttributes(windowParams);
- }
-
- private void initView() {
- TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[]{android.R.attr.windowAnimationStyle});
- int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
- activityStyle.recycle();
- activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[]{android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
- activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
- activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
- activityStyle.recycle();
-
- //设置布局在底部
- getWindow().setGravity(Gravity.BOTTOM);
- //设置布局填充满宽度
- WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
- layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
- getWindow().setAttributes(layoutParams);
- initTimePicker();
- setYiMiaoTextColor(1);
-
- tvTime.setText(DateUtils.getStringDateYMD());
-
- }
-
- @SuppressLint("ClickableViewAccessibility")
- private void initListener() {
- relativeLayout.setOnClickListener(this);
- rlDate.setOnClickListener(this);
- tvCancel.setOnClickListener(this);
- tvConfirm.setOnClickListener(this);
-
- }
-
- //重写finish方法
- @Override
- public void finish() {
- super.finish();
- //finish时调用退出动画
- overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
- }
-
-
- @Override
- protected void onDestroy() {
- mType = "";
- mPetId = 0;
- isNotes = false;
- bean = null;
- super.onDestroy();
- }
- }
4、解决软件问题
思路:使用 SoftKeyBoardListener工具类监听软件是否弹出,然后根据软件盘的高度进行设置
- private void initKeyBoard() {
- SoftKeyBoardListener.setListener(this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
- @Override
- public void keyBoardShow(int height) {
- LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams();
- layoutParams.height = height - fragment.getHeight();//fragment.getHeight()输入框下的那个高度
- v.setLayoutParams(layoutParams);
- }
-
- @Override
- public void keyBoardHide(int height) {
- LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams();
- layoutParams.height = 0;
- v.setLayoutParams(layoutParams);
- }
- });
- }
效果图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。