覆盖自定义视图中的空方法并在 MainActivity 中处理它

Posted

技术标签:

【中文标题】覆盖自定义视图中的空方法并在 MainActivity 中处理它【英文标题】:override empty method in custom view and handle it in MainActivity 【发布时间】:2016-04-23 20:18:31 【问题描述】:

为了简单起见,我制作了一个自定义日历视图 (RelativeLayout)。事件(linearLayouts)被放置在其中。当我单击事件时,我希望能够做某事,但我希望在我的 MainActivity 中完成这件事。换句话说,我想在我的自定义视图中覆盖空方法并在我的 MainActivity 中处理它。

                    eventView.setTag(event.getDatabaseId());
                    eventView.setOnClickListener(new OnClickListener() 
                        @Override
                        public void onClick(View v) 
                            Log.d("test", "" + v.getTag());
                            onEventClick((int) v.getTag());
                        
                    );
                    eventView.setOnLongClickListener(new OnLongClickListener() 
                        @Override
                        public boolean onLongClick(View v) 
                            onEventLongClick((int) v.getTag());
                            return false;
                        
                    );
    

...

    public void onEventClick(int eventId) 

    

    public void onEventLongClick(int eventId) 

    

所以在我的 MainActivity 中我实例化了我的视图:

    cv = ((CalendarView)findViewById(R.id.calendar_view));

我想做这样的事情:

    cv = ((CalendarView)findViewById(R.id.calendar_view)) 
        @Override
        public void onEventClick(int eventId) 
            // here I will fetch the data and display a dialog
        

        @Override
        public void onEventLongClick(int eventId) 
            // here I will fetch the data and display a dialog
        
    ;

我希望能够在其他地方使用我的日历,所以这就是为什么我不想将点击功能绑定到我的自定义视图中

我尝试将我的观点抽象化,但也无济于事。

编辑:eventView 位于 viewpager 中

【问题讨论】:

我认为你做不到。 findViewById 返回一个视图,你不能从它上面创建一个匿名类 哦,我知道,这只是一个演示,表明我想以某种方式将它带到 MainActivity 你能展示你完整的自定义视图类吗?我假设您可以定义自己的接口并将其作为参数传递给另一个类 我会,但它就像 600 行。我认为下面的答案会解决它,但谢谢! 是的,下面的方法是推荐的方法。我以为你已经这样做了,这就是我想看课程的原因 【参考方案1】:

您应该在自定义视图上使用Interface

在其最常见的形式中,接口是一组具有空主体的相关方法。你可以找到更详细的说明here

所以在你的情况下,我假设你有一个 RelativeLayout 作为你的自定义视图

public class MyCalendarLayout extends RelativeLayouts

    //Your constructor methods

    public interface MyEventListener 
        public void onEventClicked();
        public void onEventLongClicked();
    

    private MyEventListener myEventListener;

        public void setListener(MyEventListener myEventListener) 
        this.myEventListener= myEventListener;
    

然后在你的Activity 上你可以这样使用它

myCustomView.setListener(new MyEventListener() 

            @Override
            public void onEventClicked() 
                // TODO Auto-generated method stub

            

            @Override
            public void onEventLongClicked() 
                // TODO Auto-generated method stub

            
        );

或者你可以使用

YourActivity extends Activity implements MyEventListener

你可以打电话

myCustomView.setListener(this); 

在您的活动上,并让句柄覆盖您的活动的方法。

【讨论】:

如果您有任何问题,请告诉我

以上是关于覆盖自定义视图中的空方法并在 MainActivity 中处理它的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化自定义 UIImageView 子类的空对象

iOS 使用自定义 Xib 和视图覆盖 initWithFrame 的正确方法?

关闭自定义模式/覆盖不更新 SwiftUI 中的视图内容

设置列表项的值时自定义适配器中的空指针异常

UITableView 被自定义日历视图覆盖

自定义视图布局线覆盖 API 16 中的其他元素