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

Boa*_*rdy 2 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我对onCreate方法的活动

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

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

        navTextView.setOnClickListener(mClickListener);
    }
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的

Jef*_*xon 6

A 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;
    }
}
Run Code Online (Sandbox Code Playgroud)