我的页面中有多个EditText
元素和两个按钮。我希望用户触摸任何一个EditText
字段,并单击任何按钮将某个值插入到他们触摸的那个EditText
字段中。不允许使用键盘输入。请帮助我完成这个功能。
我的页面中有多个EditText
元素和两个按钮。我希望用户触摸任何一个EditText
字段,并单击任何按钮将某个值插入到他们触摸的那个EditText
字段中。不允许使用键盘输入。请帮助我完成这个功能。
你可以使用View.OnFocusChangeListener
来检测任何视图(如EditText)是否获得或失去焦点。
for (EditText view : editList){
view.setOnFocusChangeListener(focusListener);
}
....
private OnFocusChangeListener focusListener = new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
focusedView = v;
} else {
focusedView = null;
}
}
}
这段代码需要放在您的活动或片段或任何您有EditText的地方。....
仅表示您可以将其放置在类中的任何其他位置。显然,您需要创建一个包含它们的数组,因此需要editList
。
对我来说这个方法可行,它返回一个布尔值。
myEditText.hasFocus()
你可以做的一件事是声明一个全局变量evalue
,通过使用onTouchListener
来确定哪个是最后选定的EditText
,然后根据evalue
的值,你可以通过按钮点击将文本值设置到EditText
中。希望你能理解。
它的代码可能如下所示:
EditText e1,e2;
Button b1,b2;
String evalue;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
e1=(EditText)findViewById(R.id.editText1);
e2=(EditText)findViewById(R.id.editText2);
b1=(Button)findViewById(R.id.button1);
b2=(Button)findViewById(R.id.button2);
e1.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View arg0, MotionEvent arg1)
{
evalue="1";
return false;
}
});
e2.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View arg0, MotionEvent arg1)
{
evalue="2";
return false;
}
});
b1.setOnClickListener(new View.OnClickListener()
{
public void onClick(View arg0) {
if(evalue=="1")
{
e1.setText("yes");
}
if(evalue=="2")
{
e2.setText("yes");
}
}
});
b2.setOnClickListener(new View.OnClickListener()
{
public void onClick(View arg0) {
if(evalue=="1")
{
e1.setText("No");
}
if(evalue=="2")
{
e2.setText("No");
}
}
});
}
它是一种逻辑性的编码,但不够完美。如果你找到了更好的,请使用它。谢谢。
使用Java 8的Lambda表达式:
EditText editTextTo = findViewById(R.id.editTextTo);
editTextTo.setOnFocusChangeListener((view, b) -> {
if (view.isFocused()) {
// Do whatever you want when the EditText is focused
// Example:
editTextFrom.setText("Focused!");
}
});
请注意,lambda函数内部的视图实际上是EditText的一个实例。
这对我有效。
e1 = (EditText) findViewById(R.id.editText1);
e1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean hasfocus) {
if (hasfocus) {
Log.e("TAG", "e1 focused")
} else {
Log.e("TAG", "e1 not focused")
}
}
});
让你的Fragment
实现OnTouchListener
和OnFocusChangeListener
接口:
public class AttributesFragment extends Fragment
implements OnTouchListener, OnFocusChangeListener {
然后使用以下方式实现:
@Override
public boolean onTouch(View view, MotionEvent event) {
if (view instanceof EditText) {
view.setOnFocusChangeListener(this); // User touched edittext
}
return false;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
}
在创建EditText
后,不要忘记设置你的监听器。
editText.setOnTouchListener(this);
如果一个EditText
框默认情况下被聚焦,但用户尚未更改该字段,则不会触发onFocusChange
事件。
我使用Java 8 (lambda表达式)实现了以下操作:
EditText myEditText = findViewById(R.id.editText);
myEditText.setOnFocusChangeListener((view, hasFocus) -> {
if(hasFocus){
Log.e("TAG", "myEditext has focus")
}else{
Log.e("TAG", "myEditext has no focus")
}
});
简单编码:
if(EditText1.isFocused()){
//EditText1 is focused
}else if(EditText2.isFocused()){
//EditText2 is focused
}
E
命名变量,否则此代码将无法编译。在这种情况下,无论是Kotlin还是Java,Lint都应该崩溃您的构建。此外,已经有一个带有此解决方案的答案。 - milosmnsedittextNeme= (EditText) findViewById(R.id.edittextNeme);
edittextNeme.setOnFocusChangeListener(this);
您需要通过view.getId()获取视图id来检查哪个视图更改了焦点,并进行相应处理。
@Override
public void onFocusChange(View view, boolean hasfocus) {
switch(view.getId()){
case R.id.edittextNeme:
//Do something
break;
...etc
}
}
val currentFocusView = activity.currentFocus
if (currentFocusView is EditText){
currentFocusView.appendText("Has Focus!")
}