我正在尝试在OnFocusChangeListener
上实施EditText
。问题是我收到了这个错误
类'FacilityScreen'必须声明为abstract或implements 抽象方法'onFocusChange(View,boolean)'in 'OnFocusChangeListener'
即使方法onFocusChange
已在OnFocusChangeListener
中实施。
这是我的代码
public class FacilityScreen extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facilty_screen);
EditText editText = (EditText) findViewById(R.id.enter_location);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasfocus) {
if(hasfocus){
//do something
}
}
});
}
}
我出错了什么?
答案 0 :(得分:1)
您的活动中需要 @Override
public void onFocusChange()
方法
比使用这样 editText.setOnFocusChangeListener(this)
检查此示例
public class FacilityScreen extends AppCompatActivity implements View.OnFocusChangeListener{
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facilty_screen);
editText = (EditText) findViewById(R.id.enter_location);
editText.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View view, boolean b) {
if(view==editText){
// perfom your action here
}
}
}
答案 1 :(得分:1)
版本1 - 在类级别处理侦听器
如果您希望类处理侦听器,那么您必须告诉视图:
editText.setOnFocusChangeListener(this);
然后你必须在类级别实现onFocusChange
。只需点击几下, Android Studio 即可帮助您完成此操作。结果应该是这样的:
public class FacilityScreen extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener {
//your other methods
@Override
public void onFocusChange(View view, boolean hasfocus) {
// your code
}
}
版本2 - 将侦听器内联为匿名类
到目前为止,您实际上是使用匿名类来处理内联侦听器。如果你想在那里听,而不是在班级,那么只需从班级中删除OnFocusChangeListener
。即删除implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener
并保留其余部分。
答案 2 :(得分:1)
您无需在Activity中实现它,替换
public class FacilityScreen extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener
到
public class FacilityScreen extends AppCompatActivity
或者,您可以覆盖Activity本身的onFocusChange方法,然后在editText中设置它,如下所示:
public class FacilityScreen extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facilty_screen);
EditText editText = (EditText) findViewById(R.id.enter_location);
editText.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
// do something
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
});
}
答案 3 :(得分:1)
您的类实现了一个接口。这意味着类(在您的示例中为Activity)必须覆盖类中的所有非抽象方法。 在这里,您混合了两种方法。如果在类声明中实现接口,则不需要创建内部类的新实例,如
new OnFocusChangeListener() {
//override a method
}
没关系,保持代码不变,只需删除即可。在这种情况下,您使用内部类方法。创建匿名实例并覆盖非抽象方法。
implements View.OnFocusChangeListener