自定义dialog样式,自动弹出软件盘

开发中android自带dialog样式有时候不能满足我们的需求,这时候就需要自定义样式了,调用dialog的setView方法可以自定义布局,代码如下

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

        View alertDialogView = View.inflate(context, R.layout.comment_input_layout, null);
        final AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.setView(alertDialogView, 0, 0, 0, 0);

        final EditText editText = (EditText) alertDialogView.findViewById(R.id.etContent);

        alertDialog.show();

//      设置dialog从底部出现动画
        Window window = alertDialog.getWindow();
        window.setContentView(R.layout.comment_input_layout);
        window.setGravity(Gravity.BOTTOM);
        window.setWindowAnimations(R.style.comment_input_dilog_anim_style);
        WindowManager windowManager = ((Activity) context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = alertDialog.getWindow().getAttributes();
        lp.width = (int) (display.getWidth()); //设置宽度
        window.setAttributes(lp);
        });

通过window设置从底部进入动画,必须在dialog.show()后面设置

但是这样写完之后,如果布局中有edittext,当dialog显示的时候,并不会自动弹出软件盘,于是需要在show()方法之前加上如下代码:

InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(etContent, InputMethodManager.RESULT_SHOWN);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

toggleSoftInput方法是切换软键盘的显示与隐藏,第一个参数不能传InputMethodManager.SHOW_FORCED,否则关闭dialog的时候不能关掉软键盘。

本来以为这样已经完美了。。。但是问题又来了,在声明edittext后声明了取消和确定两个button,并设置了监听,但是监听不起作用,按钮点击没有任何反应。解决办法:

在设置动画,宽度等操作后面再用window.findViewById声明控件,设置监听事件。具体原因不知道,感觉是window.setContentView(R.layout.comment_input_layout);

把原来的控件覆盖掉了,最后附上完整代码:

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

        View alertDialogView = View.inflate(context, R.layout.comment_input_layout, null);
        final AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.setView(alertDialogView, 0, 0, 0, 0);

        final EditText editText = (EditText) alertDialogView.findViewById(R.id.etContent);

        //自动弹出软键盘
        alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            public void onShow(DialogInterface dialog) {
                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(editText, InputMethodManager.RESULT_SHOWN);
                imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
            }
        });
        alertDialog.show();

        Window window = alertDialog.getWindow();
        window.setContentView(R.layout.comment_input_layout);
        window.setGravity(Gravity.BOTTOM);
        window.setWindowAnimations(R.style.comment_input_dilog_anim_style);
        WindowManager windowManager = ((Activity) context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = alertDialog.getWindow().getAttributes();
        lp.width = (int) (display.getWidth()); //设置宽度
        window.setAttributes(lp);

        ImageButton ibtnClose=(ImageButton)window.findViewById(R.id.ibtnClose);
        final ImageButton ibtnRight=(ImageButton)window.findViewById(R.id.ibtnRight);
        final EditText etContent = (EditText) window.findViewById(R.id.etContent);
        ibtnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alertDialog.cancel();
            }
        });

        ibtnRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(ibtnRightClickListener!=null){
                    ibtnRightClickListener.sendComment(etContent.getText().toString());
                }
                alertDialog.cancel();
            }
        });

时间: 2024-12-14 08:52:42

自定义dialog样式,自动弹出软件盘的相关文章

关于带有EditText的自定义AlertDialog,不能弹出软件盘的解决方法

原文 : 关于带有EditText的自定义AlertDialog,不能弹出软件盘的解决方法 mDialog = new AlertDialog.Builder(context, R.style.AlertDialog).create(); mDialog .show(); mDialog .getWindow().setContentView(layout); 原先的代码是这样的,但是运行后发现当弹出对话框的时候点击edittext无法弹出软键盘,但是这样写又能弹出软键盘: mDialog =

问题系列:解决Dialog全屏显示以及Dialog显示自动弹出输入法(转)

继承实现一个dialog,并在onCreate里面做处理. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.some_layout); //设置全屏 getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutP

OGEngine 弹出软件盘手动输入文字处理

import android.content.Context; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.TextWatcher; import android.text.method.PasswordTransformationMethod; import android.view.KeyEvent; impo

android studio真机测试页面跳转时自动弹出软件,报错null exception解决方案

写的ASdemo登录页面后将实现页面跳转,可以看到跳转页面后自动弹出软件,查看AS的logcat说明错误原因时java的空指针问题! 解决方案: 查看新的页面(activity)代码是否存在空指针!发现我的一个String 类型的变量存在直接判等操作eg: if ( !name[0].equals("F") ) { ..... },这句话有问题,由于我的name字符串里面的值来自于其他数据库操作获取数据,全局变量只声明未初始化,在参与计算时先判断一下是否为null! 所以先判断if (

Android自定义Dialog样式

效果图: 核心代码: package com.zms.toast; import android.app.Dialog; import android.content.Context; import android.content.res.Resources; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.view.Gravity;

Android不自动弹出软键盘和不让软键盘弹出挤压图形

软键盘弹出挤压图形很变态,设计好的模型会在软件盘弹出数据变得丑陋无比,为了保持不变,只需要在 Manifest.xml 相应的 Activity 里添加 android:windowSoftInputMode="adjustPan|stateHidden" 为了不让软件盘弹出,如果是Activity的话,可以直接添加如下代码解决自动弹出软键盘的问题 <activity android:name="com.guandehao.baobiao.B_KuCunBaoBiao&

android 中自定义软件盘用于特需界面的输入

在做p2p理财项目,有些界面避免有校身份证号码及购买数量的输入,所以采取自定义软件盘的方式来实现更好的输入体验. 那么怎么弹出和隐藏自己自定义的软键盘呢?关键代码如下 if (SDK_INT <= 10) { // 屏蔽默认输入法 edText.setInputType(InputType.TYPE_NULL); } else { //反射的方法实现避免弹出系统自带的软键盘 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_

Android创建自定义dialog方法详解-样式去掉阴影效果

在自定义组件时,从已有组件源码中会很大收获.就拿progressDialog来说     间接父类是dialog,想了解dialog继承结构可以去百度,或者    从构造器来说ProgressDialog(Context context, int theme)很明显需要个样式主题文件,我们可以在value文件下自定义一个样式文件.   从外观上需要个动态效果控件和文本框两个属性    ProgressBar mProgress;   TextView mMessageView源码中onCreat

Android自定义dialog中的EditText无法弹出键盘的解决

最近我独立开发的项目<全医会>已经在内测当中了,很快将会上架到各大应用市场.之前开发的几个项目都因为一些原因没有上架还是比较遗憾的.所以,最近我心情格外的好. 今天在做一个新项目,专为律师和客户开发的APP,其中有一个自定义对话框的需求.这个知识点其实很简单,就是下图这个效果: 可是当我悠闲的写完以后才发现,自定义对话框里面嵌套的EditText根本无法获取焦点,无法弹出软键盘,郁闷,以前开发的软件里面没有EditText的时候一切正常,没有发现这个隐藏的坑.下图是我之前写的一个自定义对话框: