说明:公司的需求是要在底部弹框中增加一个输入框,并且最底部分是时间选择器,点击编辑框时,遮挡住时间选择框布局
使用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);
}
});
}
效果图