仍然收到错误:"在"OnFocusChangeListener"中实现抽象方法'onFocusChange(View,布尔值)',即使该方法已实现



我正在尝试在EditText上实现OnFocusChangeListener。问题是我遇到了这个错误

class"设施屏幕"必须被声明为抽象或实施 抽象方法" FocusChange(视图,布尔值(" 'Focuschangelistener'

即使方法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
                }
            }
        });
    }
}

我出了什么问题?

您需要 @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
        }
    }
}

您不需要在活动中实现它,替换

 public class FacilityScreen extends AppCompatActivity implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener

to

 public class FacilityScreen extends AppCompatActivity

另外,您可以在活动本身中覆盖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) {
    });
}

您的类实现接口。这意味着该类(在您的示例中:活动(必须覆盖类中的所有非抽象方法。在这里,您已经混合了两种方法。如果您在类声明中实现界面,则无需创建内在类的新实例,例如

 new OnFocusChangeListener() {
//override a method
}

可以,保留您的代码,只需删除即可。在这种情况下,您使用内部类方法。创建匿名实例并覆盖非抽象方法。

implements View.OnFocusChangeListener

版本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即可。IE。删除implements AdapterView.OnItemSelectedListener,View.OnFocusChangeListener并将其余的时间保持在。

最新更新