Android EditText与Button和Button点击出现的Dialog联动问题
2017-09-16 14:34
477 查看
实际项目中有个需求让本菜鸡头疼许久,没什么技术难点主要是脑子笨,改了这里那里出错,最后总结一下 预防下次再犯二 , 最终总结下来 知识其实没多少 , 就是自己第一次从头一点一点想有点耗时。
实际需求简化版:一个页面里面有很多Item 每个Item主要里面有 一个Button 和一个EditText , Button点击进去里面有一个EditText 里面展示的是外面EditText的文字 点击确定按钮内部EditText文字输入到外部 , 点击取消按钮取消操作 , 点击Dialog外部也把已经输入的文字传到外面对应的EditText , 外部EditText 文字变化 左边Button文字也会变化。
布局 : 三组Item 每组有一个Button 和 EditText
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
tools:context="com.example.administrator.hongyangzx.MainActivity">
<!--android:focusable="true"
android:focusableInTouchMode="true"
这两行写在在外层的父控件就可以防止EditText自动获取焦点-->
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn1"/>
<EditText
android:id="@+id/et1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn2"/&
4000
gt;
<EditText
android:id="@+id/et2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn3"/>
<EditText
android:id="@+id/et3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
Dialog布局: 有一个EditText 和 确定 取消 按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="150dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="输入内容"/>
<EditText
android:id="@+id/et0"
android:layout_width="150dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_ok"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="OK"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Cancel"/>
</LinearLayout>
接下来重头戏 MainActivity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher {
private Button btn1, btn2, btn3;
private EditText et1, et2, et3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void showDialog(final String str, final EditText et) {
final Dialog dialog = new Dialog(this);
View view = LayoutInflater.from(this).inflate(R.layout.dialog_item, null);
final EditText et0 = view.findViewById(R.id.et0);
Button ok = view.findViewById(R.id.btn_ok);
Button cancel = view.findViewById(R.id.btn_cancel);
et0.setText(str);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
et.setText(et0.getText().toString());
dialog.dismiss();
}
});
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
et.setText(et0.getText().toString());
}
});
dialog.setContentView(view);
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn1:
et1.requestFocus();
showDialog(et1.getText().toString(), et1);
break;
case R.id.btn2:
et2.requestFocus();
showDialog(et2.getText().toString(), et2);
break;
case R.id.btn3:
et3.requestFocus();
showDialog(et3.getText().toString(), et3);
break;
}
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String str = charSequence.toString();
if (et1.hasFocus()) {
btn1.setText(str);
} else if (et2.hasFocus()) {
btn2.setText(str);
} else {
btn3.setText(str);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
private void initView() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
et3 = (EditText) findViewById(R.id.et3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
et1.addTextChangedListener(this);
et2.addTextChangedListener(this);
et3.addTextChangedListener(this);
}
}
贴完 , 下面总结一下 小细节
第一步 , 初始化(这个不用说了吧、、、)控件绑定Id Button点击事件 , Edittext文字监听
第二步 , 在Button点击事件里面写出现Dialog, 传入外部EditText 文字内容 , 确定按钮 把内部EditText内容传给外部EditText , 点击外部也不内容传给外部
第三步 , 点击Button的时候给使对应的EditText获取焦点
第四步 , 在EditText文字监听里面做判断 , 根据哪个EditText获取焦点就执行对应操作
-----------------------------------------------------------分割线------------------------------------------------------------------
小知识点总结:
① 在Xml里面使EditText不自动获取焦点 ------- 在父控件 添加下面两行代码
android:focusable="true"
android:focusableInTouchMode="true"
② 使EditText 获取焦点 ------ Java代码中调用方法
et.requestFocus();
③ 文字监听中 , 根据哪个EditText获取焦点 进行对应操作
④ 真的没啥知识,我只是做个总结 , 编不下去了。。。
实际需求简化版:一个页面里面有很多Item 每个Item主要里面有 一个Button 和一个EditText , Button点击进去里面有一个EditText 里面展示的是外面EditText的文字 点击确定按钮内部EditText文字输入到外部 , 点击取消按钮取消操作 , 点击Dialog外部也把已经输入的文字传到外面对应的EditText , 外部EditText 文字变化 左边Button文字也会变化。
布局 : 三组Item 每组有一个Button 和 EditText
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
tools:context="com.example.administrator.hongyangzx.MainActivity">
<!--android:focusable="true"
android:focusableInTouchMode="true"
这两行写在在外层的父控件就可以防止EditText自动获取焦点-->
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn1"/>
<EditText
android:id="@+id/et1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn2"/&
4000
gt;
<EditText
android:id="@+id/et2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
<!--三组-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:textAllCaps="false"
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="btn3"/>
<EditText
android:id="@+id/et3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
Dialog布局: 有一个EditText 和 确定 取消 按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="150dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="输入内容"/>
<EditText
android:id="@+id/et0"
android:layout_width="150dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_ok"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="OK"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Cancel"/>
</LinearLayout>
接下来重头戏 MainActivity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher {
private Button btn1, btn2, btn3;
private EditText et1, et2, et3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void showDialog(final String str, final EditText et) {
final Dialog dialog = new Dialog(this);
View view = LayoutInflater.from(this).inflate(R.layout.dialog_item, null);
final EditText et0 = view.findViewById(R.id.et0);
Button ok = view.findViewById(R.id.btn_ok);
Button cancel = view.findViewById(R.id.btn_cancel);
et0.setText(str);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
et.setText(et0.getText().toString());
dialog.dismiss();
}
});
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
et.setText(et0.getText().toString());
}
});
dialog.setContentView(view);
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn1:
et1.requestFocus();
showDialog(et1.getText().toString(), et1);
break;
case R.id.btn2:
et2.requestFocus();
showDialog(et2.getText().toString(), et2);
break;
case R.id.btn3:
et3.requestFocus();
showDialog(et3.getText().toString(), et3);
break;
}
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String str = charSequence.toString();
if (et1.hasFocus()) {
btn1.setText(str);
} else if (et2.hasFocus()) {
btn2.setText(str);
} else {
btn3.setText(str);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
private void initView() {
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
et1 = (EditText) findViewById(R.id.et1);
et2 = (EditText) findViewById(R.id.et2);
et3 = (EditText) findViewById(R.id.et3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
et1.addTextChangedListener(this);
et2.addTextChangedListener(this);
et3.addTextChangedListener(this);
}
}
贴完 , 下面总结一下 小细节
第一步 , 初始化(这个不用说了吧、、、)控件绑定Id Button点击事件 , Edittext文字监听
第二步 , 在Button点击事件里面写出现Dialog, 传入外部EditText 文字内容 , 确定按钮 把内部EditText内容传给外部EditText , 点击外部也不内容传给外部
第三步 , 点击Button的时候给使对应的EditText获取焦点
第四步 , 在EditText文字监听里面做判断 , 根据哪个EditText获取焦点就执行对应操作
-----------------------------------------------------------分割线------------------------------------------------------------------
小知识点总结:
① 在Xml里面使EditText不自动获取焦点 ------- 在父控件 添加下面两行代码
android:focusable="true"
android:focusableInTouchMode="true"
② 使EditText 获取焦点 ------ Java代码中调用方法
et.requestFocus();
③ 文字监听中 , 根据哪个EditText获取焦点 进行对应操作
④ 真的没啥知识,我只是做个总结 , 编不下去了。。。
相关文章推荐
- android 语言国际化 + 点击按钮出现menu + 点击menu出现dialog对话框 + radiobutton 点击事件
- android 点击button 出现popupwindow的二级联动菜单
- 关于android 设置TextView可点击出现覆盖的问题
- 17-Android界面控件之Button,点击Button然后出现提示信息
- 关于cocos2d-x(Android)集成广告点击广告后再点击back键退出桌面并出现黑屏问题
- Android LinearLayout 嵌套 button 监听LinearLayout的onClickListener事件出现问题
- android EditText实现点击弹出dialog
- [学习笔记][ASP.NET2.0][点击asp:Button出现两次提交数据的问题][解决:去掉OnClick或者OnCommand属性]
- Android ActivityGroup的子类中调用AlertDialog出现问题
- Android Alert Dialog解决点击按钮对话框不关闭/的问题
- 关于Android中Dialog点击屏幕外失去焦点消失的问题
- Android 自定义Dialog时出现成员变量为null的问题
- Android AlertDialog解决点击按钮立即消失的问题
- 安卓出现android.widget.TextView cannot be cast to android.widget.Button问题
- android点击出现日期选择DatePickerDialog,并获取日期
- android listviewListview中的button点击事件或者是onitemclick不响应的问题
- android EditText和TextView出现中文、英文等string串的排版问题
- android AlertDialog设置点击button不退出
- Android基础:listview的item点击事件会使里面的Button也出现按压的效果
- android简单的手势分发(处理ListView的Item带有Button点击冲突问题)