android - 使用覆盖 onclick 创建自定义控件

标签 android onclick

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

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

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

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

我想要发生的是,当我的自定义控件被单击时,我的 Activity 被重写 onclick 显示 toast 并且自定义控件类 on 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");
    }
}

下面是我的 Activity onCreate方法

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

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

        navTextView.setOnClickListener(mClickListener);
    }

希望这是有道理的

最佳答案

一个View只能有一个OnClickListener。在您的 NavTextView 中,您将其设置在那里。如果您稍后再次调用 setOnClickListener,您将替换之前的监听器。

您可以做的是在您的自定义 View 中覆盖 setOnClickListener,然后包装 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;
    }
}

关于android - 使用覆盖 onclick 创建自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808162/

相关文章:

android - 如何以编程方式修改现有apk中 Assets 文件夹中的数据?

android - 在 android 中获取自己的电话号码(测试了许多问题但未解决)?

android - 使用 Sencha Touch 2 构建器创建 Android 应用程序

Javascript onclick 只工作一次

javascript - Jquery-点击时实现下拉菜单

android:hint 不使用 EditText 在焦点上消失

java - 安卓 : Using DatePicker from Fragment

javascript - onclick() 和 onblur() 从不在 IE8 中工作

jquery - 这段代码缺少什么?

java - 如何在android中显示带有链接的数据库列表?