通过覆盖onclick创建自定义控件

时间:2014-11-07 18:56:09

标签: android onclick

我正在开发一个Android应用程序,我有一个自定义GUI组件,它扩展了TextView。

我希望我的自定义控件在从我的自定义控件类和我的重写的onclick方法中单击时执行任务。

例如,扩展TextView的类实现了OnClick侦听器并将日志写入日志cat。

然后在我的活动中,我将一个onclick监听器设置为我的自定义控件,这显示了一个Toast通知。

我想要发生的是,当我点击我的自定义控件时,我的活动被覆盖onclick显示toast并且click方法上的自定义控件类也会运行以显示日志。但是我似乎只能得到一个工作或者另一个,例如,如果我不运行myCustom.setOnClickListener(myListener)然后使用类onclick并执行日志,如果我设置onClick监听器然后我只得到吐司而不是日志。

以下是我的自定义控件类

public class NavTextView extends TextView implements View.OnClickListener
{
    public NavTextView(Context context) {
        super(context);
        setOnClickListener(this);
    }

    public NavTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnClickListener(this);
    }

    public NavTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOnClickListener(this);
    }

    public NavTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.d("NavTextView", "This has been clicked");
    }
}

以下是我关于创建方法的活动

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        navTextView = (NavTextView)findViewById(R.id.navTextView);

        navTextView.setOnClickListener(mClickListener);
    }

希望这是有道理的

1 个答案:

答案 0 :(得分:6)

View只能有一个OnClickListener。在你的NavTextView中,你将它设置在那里。如果您稍后再次呼叫setOnClickListener,则表示您正在替换之前的侦听器。

您可以执行的操作是覆盖自定义setOnClickListener中的View,然后换行OnClickListener并同时调用它们。

public class MyTextView extends TextView implements View.OnClickListener
{
    OnClickListener _wrappedOnClickListener;

    public MyTextView(Context context) {
        super(context);
        super.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        Log.d("NavTextView", "This has been clicked");

        if (_wrappedOnClickListener != null)
            _wrappedOnClickListener.onClick(view);
    }

    @Override
    public void setOnClickListener(OnClickListener l) {
        _wrappedOnClickListener = l;
    }
}