使用Activity实现dialog效果(并解决输入框在软键盘顶部方法)

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

使用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);
            }
        });
    }

效果图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值