带有扩展 EditText 的回调

Callback with extended EditText

我正在尝试创建一个提供 onLostFocus 事件的自定义 EditText。但是,当焦点丢失时,我无法理解如何告诉自定义 class 什么方法 运行。

这是我的扩展 EditText:

public class smtyEditText extends EditText {    
    public smtyEditText(Context context) {
        super(context);
    }

    public smtyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public smtyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setFocusChangeListener() {
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    // notify the relevant activity, probably passing it some parameters like what instance of smtyEditText triggered the event.    
                }
            }
        });
    }
}

setFocusChangeListener 函数的目的是从任何给定的 activity 我可以做类似的事情:

public class AddMeal extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_meal);

        EditText etMealName = (EditText) findViewById(R.id.txtmealName);
        etMealName.setFocusChangeListener(this.fieldLostFocus)
    }

    // then
    public void fieldLostFocus(eventSource) {
        // run some kind of validation on the field text.
    }
}

显然我 "code paraphrasing" 在这里。我还得到了接口,可能还需要其他一些 "EventNotifier" class。到目前为止,这些是我试图破译的资源:

但无论出于何种原因,我无法明确需要什么。你对我如何实现这一点有什么建议吗?

您不需要继承...它只会添加一个不必要的间接层。只需在 activity.

中添加焦点更改处理程序
public class AddMeal extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_meal);

        EditText etMealName = (EditText) findViewById(R.id.txtmealName);
        etMealName.setFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                // call method to handle loss of focus 
            }
        }
    });
    }

    // then
    public void fieldLostFocus(eventSource) {
        // run some kind of validation on the field text.
    }
}