Android点击显示一个可编辑文本的dialog(解决失去光标问题)

释放双眼,带上耳机,听听看~!

前言:

一个简单的实现方式举例。

描述:

需求上可能会提出这样一点:点击一个按钮,展示一个dialog弹窗,这个弹窗上有①可编辑文本,②确定按钮,③取消按钮。

具体操作:

那么针对这个需求,我们常规性的话,应该创建一个工程,写一个demo,创建一个BaseActivity界面,让我们后续创建的所有Activity都去继承它。

比如我们创建完工程之后,默认是拥有MainActivity,那么让MainActivity去继承BaseActivity,BaseActivity里在下文会提到里面要写什么内容。

MainActivity中,按需求功能,我们在它的XML文件内创建一个Button控件,简单设置常规属于,然后在MainActivity中声明:

如下:private Button btn_show_dialog;

再在onCreate方法中找到这个控件:

如下:btn_show_dialog=(Button)findViewById(btn_show_dialog);

再给这个控件增加点击事件:

btn_show_dialog.setOnClickListener(…..);

当执行点击事件时候,我们在点击的方法里面去调用显示弹窗的方法,我们创建一个弹窗布局

如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="420dp"
android:layout_height="217dp"
android:layout_gravity="center"
android:layout_marginLeft="@dimen/ds_43dp"
android:layout_marginRight="@dimen/ds_43dp"
android:background="@drawable/yuanjiao"
android:orientation="vertical">
<!--修改用户资料的dialog的弹窗-->
<EditText
android:id="@+id/edit_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/ds_60dp"
android:background="@null"
android:hint="请输入要修改的内容"
android:textColor="@color/cs_555555"
android:textColorHint="@color/cs_999999"
android:textSize="@dimen/ds_24sp" />
    <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="16dp"
android:orientation="horizontal">
<!--是-->
<Button
android:id="@+id/btn_yes"
android:layout_width="188dp"
android:layout_height="@dimen/ds_43dp"
android:layout_marginLeft="@dimen/ds_15dp"
android:layout_marginRight="@dimen/ds_8dp"
android:layout_weight="1"
android:background="@drawable/greenyuanjiao"
android:text="是"
android:textColor="@color/white"
android:textSize="@dimen/ds_20sp" />
<!--否-->
<Button
android:id="@+id/btn_no"
android:layout_width="188dp"
android:layout_height="@dimen/ds_43dp"
android:layout_marginLeft="@dimen/ds_8dp"
android:layout_marginRight="@dimen/ds_15dp"
android:layout_weight="1"
android:background="@drawable/moregrayyuanjiao"
android:text="否"
android:textColor="@color/white"
android:textSize="@dimen/ds_20sp" />
    </LinearLayout>
</RelativeLayout>

然后我们写一个显示弹窗的方法:

/**
 * 点击个人资料的弹窗
 **/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void showContentDialog() {
grDdialog = new AlertDialog.Builder(mContext, R.style.Dialog).create();
grDdialog.setCancelable(false);
grDdialog.setCanceledOnTouchOutside(true);
grDdialog.setView(new EditText(mContext));
grDdialog.show();
grDdialog.getWindow().setContentView(R.layout.edit_teacher_info_dialog);
    final EditText edit_content = (EditText) grDdialog.findViewById(R.id.edit_content);
grDdialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// 解决EditText, 在dialog中无法自动弹出对话框的问题
showKeyboard(edit_content);
}
});
Button btn_yes = (Button) grDdialog.findViewById(R.id.btn_yes);
Button btn_no = (Button) grDdialog.findViewById(R.id.btn_no);
//是
btn_yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//做非空判断
if (edit_content.getText().toString().length() > 0) {
//学科
tv_charge_subject.setText(edit_content.getText().toString().trim());
grDdialog.dismiss();
} else {
T.showShort(mContext, "请确保输入的内容不为空!");
}
}
});
//否
btn_no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
grDdialog.dismiss();
}
});
}

注意:dialog在点击是,否的情况下都要dismiss。而且如果离开此页面。在界面销毁的生命周期,也要关闭

如下:if (grDdialog!=null){grDdialog.dismiss);}

创建一个解决弹窗内edittext点击失去光标的方法:

如下:

/**
 * 解决在dialog中无法自动弹出对话框的问题
 **/
@TargetApi(Build.VERSION_CODES.CUPCAKE)
public void showKeyboard(EditText editText) {
if (editText != null) {
//设置可获得焦点
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
//请求获得焦点
editText.requestFocus();
//调用系统输入法
InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}

最后再附上:点击空白区域关闭软键盘的3个常用方法,放在baseActivity中,这样一套完整的demo就写好了。

关闭软键盘方法:

如下:

/**
 * 1点击空白位置 隐藏软键盘
 */
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
        if (isShouldHideKeyboard(v, ev)) {
hideKeyboard(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
/**
 * 2根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
 */
private boolean isShouldHideKeyboard(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
        int left = l[0],
top = l[1],
bottom = top + v.getHeight(),
right = left + v.getWidth();
        if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击EditText的事件,忽略它。
return false;
} else {
return true;
}
}
// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
return false;
}
/**
 * 3获取InputMethodManager,隐藏软键盘
 */
private void hideKeyboard(IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}原文 https://blog.csdn.net/qq_35874340/article/details/80663797

人已赞赏
Android文章

Android开发打印过长Log日志

2020-3-10 19:55:14

Android文章

Android开发Html改字色随笔

2020-3-10 20:16:07

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索