【问题标题】:Extend android View class and affect all sub classes扩展android View类并影响所有子类
【发布时间】:2014-03-27 17:20:06
【问题描述】:

我需要在 Android 中扩展 View 类以覆盖几个方法。

public class ExtendedView extends View {

    public ExtendedView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null) 
            getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
    }

     ...
}

android 中有几个视图类型是从View 派生的,例如 ImageView 等。

他们无法访问 ExtendedView 类中的重写方法。

一种解决方案是为所有这些类创建扩展类,例如:

public class ExtendedImageView extends ImageView

并覆盖方法。

但是有没有更好的解决方案来避免这种代码冗余?

【问题讨论】:

  • 您要创建什么类型的视图。是 ImageView 有一些特殊属性,还是 View 有特殊属性。
  • @GauravGupta 我认为问题很明确。 OP 希望覆盖基类中的方法,这些方法由基类的所有子类继承。
  • 有几个视图类型需要受到影响,例如 ImageView、MapView、WebView 等。我必须编写与在 View 类中编写的相同的重写方法。
  • 我觉得你建议的解决方案很好。对于代码冗余,您可以集中代码并将基本参数传递给集中代码。
  • 你说你想覆盖“一对”方法,但只显示onTouchEvent。对于那个,我建议使用setOnTouchListener() 而不是覆盖。也许其他方法也有类似的监听器可以设置?

标签: java android oop view


【解决方案1】:

创建一个实现 onTouchEventListener 的 BaseActivity(或者类似的东西,不记得了),然后当你有一个需要处理它的视图时,只需 setOnTouchListener(this)

当然,让你的活动扩展 BaseActivity

问候

【讨论】:

  • onTouchEvent 只是一个示例方法。这不是我在问题中确切提出的问题。谢谢你的回答。
  • 那么是的,你将不得不是多余的。此外,创建从 View 扩展的类不会使 ImageView 或 MapView 继承该方法,因此无论如何您都必须覆盖所有人
【解决方案2】:

在我看来,这是一种简单而体面的方式。 在这里,您的代码是集中式的,并给出了一个通用实现,所有预期的ExtendedView 类都将使用它。

class MyImplementation
{
 public boolean methodA(View v, MotionEvent event)
 {
  boolean someBoolean = false;
  // some impl of your spl method.
  if(v instanceOf ExtendedImageView)
   {
     // ImageView called this method.
   }

 }
 return someBoolean;
}

图像视图实现

public class ExtendedImageView extends ImageView{
    public boolean onTouchEvent (MotionEvent event)
     {
       MyImplementaion a  = new MyImplemenation();
       boolean b = a.methodA(this, event);
       return b;
     }
}

其他视图

public class ExtendedMapView extends MapView{

       public boolean onTouchEvent (MotionEvent event)
       {
        MyImplementaion a  = new MyImplemenation();
        boolean b = a.methodA(this, event);
        return b;
       }
}

【讨论】:

  • ExtendedView 扩展 View 怎么样?不确定您是否理解我的问题,但感谢您的努力。
  • ExtendedView extends View 将导致单独的分支。这样你将无法向 ImageView 添加特殊操作。
  • 我需要的是可以覆盖的方法,例如onTouchEvent。我不能在 MyImplementation 类中这样做。
  • 这里的someViewMethod 代表你想要覆盖的方法。由于 2,3 个类具有相同的 someViewMethod 实现,所以我创建了另一个包含通用实现的类,这样,通用代码将被编写一次,并且可以通过调用它被不同的方法使用。查看我的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多