您的位置:首页 > 移动开发 > Android开发

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获取焦点  进行对应操作

④ 真的没啥知识,我只是做个总结 , 编不下去了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐