Android中弹窗中带有Edittext,软键盘遮挡问题

来源:互联网 发布:java变量定义规则 编辑:程序博客网 时间:2024/05/14 02:46

关于dialog遇到的问题
我们都知道弹窗dialog所需要传入的上下文必须是Activity对象,其实现在也有全局的dialog,但是需要权限

    <!-- //全局dialog --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

但是经测试在小米6.0上,这个权限是默认关闭的,当然6.0以上,Android涉及到危险权限和普通权限,危险权限不仅仅要再清单文件中声明,在页面涉及到该权限的时候,会弹出系统提示框来提示用户,当然我们一般会自定义弹窗,因为仅仅依赖系统的权限弹窗提示是不行的,因为用户可能点击了拒绝并且不再提醒,这里运行时权限可以考虑使用鸿洋大神的 eastPermission 或者XPermission,在用户拒绝之后,弹出提示,进入到设置界面,用法非常简单,今天的主题不是这个就不再说了,今天的主题是用另外一种思路来实现弹窗

使用弹窗样式的Activity来代替dialog

跟刚才说的一样,dialog上有edittext,会导致软键盘挡住弹窗,网上很多解决办法都试过了,没用,后来想到最简单的方法就是用一个弹窗样式的Activity来代替dialog,

    <style name="dialogstyle" parent="Theme.AppCompat.Light.Dialog">    <!--设置dialog的背景-->    <item name="android:windowBackground">@android:color/transparent</item>    <!--设置Dialog的windowFrame框为无-->    <item name="android:windowFrame">@null</item>    <!--设置无标题-->    <item name="android:windowNoTitle">true</item>    <!--是否浮现在activity之上-->    <item name="android:windowIsFloating">true</item>    <!--是否半透明-->    <item name="android:windowIsTranslucent">true</item>    <!--设置窗口内容不覆盖-->    <item name="android:windowContentOverlay">@null</item>    <!--设置动画,在这里使用让它继承系统的Animation.Dialog-->    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>    <!--背景是否模糊显示-->    <item name="android:backgroundDimEnabled">true</item></style>

清单文件

        <activity        android:name=".activity.DialogAty"        android:screenOrientation="portrait"        android:theme="@style/dialogstyle"/>

DialogActivity

public class DialogAty extends Activity {@BindView(R.id.et_password)EditText mEtPassword;@BindView(R.id.btn_cancel)Button mBtnCancel;@BindView(R.id.btn_confirm)Button mBtnConfirm;@BindView(R.id.ll_btns)AutoRelativeLayout mLlBtns;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_dialog_aty);    //点击外部,消失    this.setFinishOnTouchOutside(false);    // Make us non-modal, so that others can receive touch events.    getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);    // ...but notify us that it happened.    getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);    ButterKnife.bind(this);}@OnClick({R.id.btn_cancel, R.id.btn_confirm})public void onViewClicked(View view) {    switch (view.getId()) {        case R.id.btn_cancel:            finish();            break;        case R.id.btn_confirm:            startActivity(new Intent(Utils.getContext(), AlarmSettingActivity.class));           // mEtPassword.getText().toString();            finish();            break;    }}@Overridepublic boolean onTouchEvent(MotionEvent event) {    // If we've received a touch notification that the user has touched    // outside the app, finish the activity.    if (MotionEvent.ACTION_OUTSIDE == event.getAction()) {        //finish();        //点击外部,软键盘消失        KeyBoardUtils.hideInputForce(this);        return true;    }    // Delegate everything else to Activity.    return super.onTouchEvent(event);}

}

xml

<?xml version="1.0" encoding="utf-8"?>

效果图

这里写图片描述

遇到的小bug

问题

中间遇到一个小插曲,就是在vivo手机上,打开这个弹窗的Activity,直接透明看到了桌面,在其他手机上没有问题

解决

从网上找了很久资料都没找到,启动模式设置为singleInstance也没用
后来找到了问题所在,是因为我用了滑动返回,所以我要把所以Activity的样式都是设置为透明的,然后每个aty布局中写背景颜色,但是偏偏在vivo(其他手机有没有该问题不知道),只要涉及到透明和透明度,看到的不是下面一个Activity,而是直接透明看到桌面,反正我试了在小米6.0和华为7.0都没问题,在vivo5.1上有这个问题,导致我的弹窗Activity一打开,弹窗以外都变透明了
后来的解决办法:把弹窗类型的Activity的上一个页面,也就是任务栈的上一个Activity,背景设置为不透明的,就ok了
工作仓促,暂时记一下,以后完善

阅读全文
0 0
原创粉丝点击