【问题标题】:Create a main abstract View in android在android中创建一个主要的抽象视图
【发布时间】:2013-09-23 09:34:57
【问题描述】:

我有一个包含自定义图像/文本视图的 RelativeLayout,所有这些共享许多共同的方法(当前收集在一个界面中)并且在所有类中实现相同。

我想尽量减少现有视图之间的重叠代码量。我知道 Java 中没有多重继承,但是有没有办法创建一个视图来保存所有类似的代码,并从 Image/Text/Layout.. 视图继承?

提前致谢

【问题讨论】:

  • 您可以创建一个自定义视图并让它从视图扩展,并让您的所有视图子类都从该视图扩展。据我所知,没有简单的出路(例如多重继承)
  • 我想过,但是如果我扩展 View,那么我将失去对说 ImageView 的所有支持,导致我重新实现那里使用的所有逻辑,我错了吗?

标签: java android android-relativelayout abstraction


【解决方案1】:

我正在通过单独的课程做类似的事情,我们称之为ViewHelper。这个类只有公共静态方法来执行你想要在接口实现中拥有的东西。我从每个实现中调用这个类。这不是一个完美的解决方案,因为我仍然有一些重复的代码,但我只是从每个实现中调用一个公共静态方法,而我在单个类中实现了 - ViewHelper

我将在下面尝试通过一些通用代码示例来描述我的意思。

界面:

public interface IView {
    public void someMeth(View view);
}

ViewHelper:

public class ViewHelper {
    public static void someMethImpl(View view) {
        /**
         * here you'll have the implementation if the implementation can be
         * abstracted to a View
         */
    }
    public static void someMethImpl(ImageView view) {
        /**
         * here you'll have the implementation if the implementation can be
         * abstracted to an ImageView
         */
    }
}

然后对于每个自定义视图/视图组类:

public class CustomRelativeLayout extends RelativeLayout implements IView {

    /// constructors

    @Override
    public void someMeth(View view) {
        ViewHelper.someMethImpl(this);
    }
}

或:

public class CustomImageView extends ImageView implements IView {

    // constructors

    @Override
    public void someMeth(View view) {
        ViewHelper.someMethImpl(this);
    }

}

或:

public class CustomTextView extends TextView implements IView {

    // constructors

    @Override
    public void someMeth(View view) {
        ViewHelper.someMethImpl(this);
    }

}

【讨论】:

  • 这对我来说似乎是一个好方法,如果这些类中也有相似的变量,你会怎么做?像一个点来指示视图在其父视图中的位置?
  • 这取决于实现细节,但如果实现相似,则在新的静态帮助方法中发送该对象并在那里进行相同的工作。如果你能分享一些例子,这个讨论会更有成效。
【解决方案2】:

创建一个简单的Java class 来保存您的逻辑并在那里编写代码,并有一个接口来执行回调逻辑,将您的接口回调路由到您创建的类。我在下面给出了一个示例实现/伪代码。

public class SampleLogicClass implements SampleInterface{    

 public sample(){
 }

 @Override
 public void callLogic1(){
 // Write something
 }

 @Override
 public void callLogic2(){
 // Write something
 }

 public void registerInterface(SampleInterface interface){
   sampleInterface = interface;
 }

 public interface SampleInterface(){
  void callLogic1();
  void callLogic2();
 }
}

您也可以从 RelativeLayout/AnyView/ViewGroup 等执行相同的操作。只需使用接口的示例注册注册回调并实现您的逻辑。如果您可以提供更多信息/代码,将很容易为您提供帮助。

【讨论】:

  • 问题是我的所有逻辑在所有类中都是相同的,我必须在所有类中以相同的方式实现它。我想避免的事情。
  • 您所要做的就是为您的逻辑创建一个单例,并使用 Singleton.getInstance().callsomeMethod(); 从任何类中调用它;
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2010-11-05
  • 2017-04-10
  • 2013-04-27
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多