仍然得到错误:'在'OnFocusChangeListener'中'实现抽象方法'onFocusChange(View,boolean)',即使该方法已经实现

时间:2018-03-29 11:52:53

标签: java android android-edittext android-view anonymous-function

我正在尝试在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
                }
            }
        });
    }
}

我出错了什么?

4 个答案:

答案 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