本文共 3919 字,大约阅读时间需要 13 分钟。
好久没动安卓原生开发,都快忘的差不多了。
项目有个需求是在弹出的 AlertDialog 中输入一些文字,这就牵扯到软键盘的自动弹出与隐藏了。虽然以前也做过,但时间久了有些生疏,还是费了些时间。所以记录下来便于以后翻阅。效果图:
点开之后自动弹出有延时,这个时间是自己设的,设多长时间根据情况而定。
关键点说明:
alertDialog.setView(LayoutInflater.from(context).inflate(R.layout.widget_ip_config, null));
alertDialog.show()
一定要在 alertDialog.getWindow().setContentView(view)
之前调用,否则 AlertDialog 不会弹出。setOnDismissListener()
监听了 onDismiss()
方法,在此方法执行隐藏软键盘的操作。下面贴代码:
先建一个封装的工具类
IpConfigWidget.java
public class IpConfigWidget { @Inject public IpConfigWidget() { } public void showIpConfigDialog(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog alertDialog = builder.create(); //解决无法弹出软键盘的bug alertDialog.setView(LayoutInflater.from(context).inflate(R.layout.widget_ip_config, null)); alertDialog.show(); View view = LayoutInflater.from(context).inflate(R.layout.widget_ip_config, null); //输入ip地址的EditText框 EditText etIpAddress = view.findViewById(R.id.et_ip_address); //自动获取焦点并弹出软键盘 showSoftInput(etIpAddress); //确定按钮 view.findViewById(R.id.tv_confirm_dialog).setOnClickListener((v) -> { String ip = etIpAddress.getText().toString().trim(); onButtonClickListener.onConfirmBtnClick(alertDialog, ip); }); //取消按钮 view.findViewById(R.id.tv_cancel_dialog).setOnClickListener((v) -> { onButtonClickListener.onCancelBtnClick(alertDialog); }); //为AlertDialog设置View alertDialog.getWindow().setContentView(view); //监听Dialog Dismiss时隐藏软键盘 alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { //隐藏软键盘 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } }); } /** * 自动获取焦点并弹出软键盘 * @param etIpAddress */ private void showSoftInput(EditText etIpAddress) { //自动获取焦点 etIpAddress.setFocusable(true); etIpAddress.setFocusableInTouchMode(true); etIpAddress.requestFocus(); //200毫秒后弹出软键盘 Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodManager inputManager = (InputMethodManager) etIpAddress.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(etIpAddress, 0); } }, 200); } /** * 对外暴露确定取消按钮点击接口 */ private OnButtonClickListener onButtonClickListener; public interface OnButtonClickListener { void onConfirmBtnClick(AlertDialog dialog, String ip); void onCancelBtnClick(AlertDialog dialog); } public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) { this.onButtonClickListener = onButtonClickListener; }}
布局文件 widget_ip_config.xml
调用方法:
IpConfigWidget ipConfigWidget = new IpConfigWidget();ipConfigWidget.showIpConfigDialog(LoginActivity.this); ipConfigWidget.setOnButtonClickListener(new IpConfigWidget.OnButtonClickListener() { @Override public void onConfirmBtnClick(AlertDialog dialog, String ip) { //自己的逻辑代码 dialog.dismiss(); } @Override public void onCancelBtnClick(AlertDialog dialog) { dialog.dismiss(); } });
转载地址:http://avvpi.baihongyu.com/