前言:
一个简单的实现方式举例。
描述:
需求上可能会提出这样一点:点击一个按钮,展示一个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