Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android:扩展Linearlayout,但RelativeLayout需要同样的扩展。重复代码不可避免吗?

Android:扩展Linearlayout,但RelativeLayout需要同样的扩展。重复代码不可避免吗?
EN

Stack Overflow用户
提问于 2013-02-10 17:48:56
回答 3查看 3.3K关注 0票数 8

我有这样的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CopyOfLinearLayoutEntry extends LinearLayout implements Checkable {
    private CheckedTextView _checkbox;
    private Context c;

    public CopyOfLinearLayoutEntry(Context context) {
        super(context);
        this.c = context;
        setWillNotDraw(false);
    }

    public CopyOfLinearLayoutEntry(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.c = context;
        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint strokePaint = new Paint();
        strokePaint.setARGB(200, 255, 230, 230);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(12);
        Rect r = canvas.getClipBounds();
        Rect outline = new Rect(1, 1, r.right - 1, r.bottom - 1);
        canvas.drawLine(r.left, r.top, r.right, r.top, strokePaint);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // find checked text view
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View v = getChildAt(i);
            if (v instanceof CheckedTextView) {
                _checkbox = (CheckedTextView) v;
            }
        }
    }

    @Override
    public boolean isChecked() {
        return _checkbox != null ? _checkbox.isChecked() : false;
    }

    @Override
    public void setChecked(boolean checked) {
        if (_checkbox != null) {
            _checkbox.setChecked(checked);
        }
    }

    @Override
    public void toggle() {
        if (_checkbox != null) {
            _checkbox.toggle();
        }
    }
}

现在我还需要一个扩展版本,因此我将复制类文件,并将“RelativeLayout LinearLayout”替换为“RelativeLayout”。我认为这将是糟糕的,因为我不想要任何重复的代码。

既然Java不允许多重继承,我该如何实现我的目标呢?

我读到了一些关于组合设计模式的东西,但我不确定如何实现它。

也许有人可以给我一个起点,告诉我如何最优雅地解决这个问题?

EN

回答 3

Stack Overflow用户

发布于 2013-02-21 22:40:21

你不需要同时扩展这两个来避免重复的代码。你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckedTextView;

public class GenericLayout extends ViewGroup{

    private CheckedTextView _checkbox;

    public GenericLayout(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint strokePaint = new Paint();
        strokePaint.setARGB(200, 255, 230, 230);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(12);
        Rect r = canvas.getClipBounds();
        Rect outline = new Rect(1, 1, r.right - 1, r.bottom - 1);
        canvas.drawLine(r.left, r.top, r.right, r.top, strokePaint);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // find checked text view
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View v = getChildAt(i);
            if (v instanceof CheckedTextView) {
                _checkbox = (CheckedTextView) v;
            }
        }
    }

    public boolean isChecked() {
        return _checkbox != null ? _checkbox.isChecked() : false;
    }

    public void setChecked(boolean checked) {
        if (_checkbox != null) {
            _checkbox.setChecked(checked);
        }
    }

    public void toggle() {
        if (_checkbox != null) {
            _checkbox.toggle();
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub

    }

}



public class Linear extends LinearLayout {

    GenericLayout generic;

    public Linear(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        generic = new GenericLayout(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        generic.onDraw(canvas);
    }

        ...

}

public class Relative extends RelativeLayout{

    GenericLayout generic;

    public Relative(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        generic.onDraw(canvas);
    }

        ...

}
票数 1
EN

Stack Overflow用户

发布于 2013-02-11 08:56:11

在我学习和使用的内容中,有两种方法:

扩展可以创建2个接口和1个类:一个用于扩展LinearLayout的接口,另一个用于扩展RelativeLayout的接口,以及实现扩展接口的方法和变量的类。

我希望这会有一点帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-02-11 14:34:00

你必须重新考虑你的方法。

看起来你是在用布局来控制视图逻辑。不幸的是,你的问题没有太多关于你试图实现的信息。

您有几种可能性:

  • 使用自定义逻辑实现布局代理/委托(错误的方法IMO)
  • 创建一个专用的处理程序类来控制视图对象...这些将独立于LAYOUT
  • 创建视图对象并使用视图对象而不是LAYOUT(可能是这样做的方式)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14800686

复制
相关文章
[深入解析C#] 可空值类型
Tony Hoare于1965年在Algol语言中首次引入了null引用的概念,后来他把这项举措称为“十亿美金的过失”。无数开发人员饱受NullReferenceException(.NET)、NullPointerException(Java)等的折磨。由于此类问题的普遍性,Stack Overflow上有大量与之相关的典型问题。既然可空特性如此声名狼藉,为何C# 2以及.NET 2.0要引入可空值类型呢?
科控物联
2022/03/29
2.3K0
常用图像插值方法概述
https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
音视频开发进阶
2021/05/10
1.7K0
常用图像插值方法概述
图像处理-图像插值
比较常用的插值算法有这么几种:最邻近插值,双线性二次插值,三次插值,Lanczos插值等等
AomanHao
2022/01/14
4.1K0
【MATLAB】图像导出 ( 导出绘制的图像 | 图像设置 )
选择 matlab 生成的图形界面 " Figure 1 " 的菜单栏 , " 编辑选项 " , 点击 " 复制图形 " , 可以将图像拷贝到 Word 文档中 ;
韩曙亮
2023/03/29
9.9K0
【MATLAB】图像导出 ( 导出绘制的图像 | 图像设置 )
【从零学习OpenCV 4】图像直方图绘制
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/12/13
1K0
图像二值化方法汇总介绍
ImageJ中图像二值化方法介绍 概述 二值图像分析在对象识别与模式匹配中有重要作用,同时也在机器人视觉中也是图像处理的关键步骤,选择不同图像二值化方法得到的结果也不尽相同。本文介绍超过十种以上的基于
OpenCV学堂
2018/04/04
4.6K1
图像二值化方法汇总介绍
将图像转换为JPG或GIF字节流。
其实这个东西真的没有什么可谈的,完全都是一堆API函数的调用,不过呢,隔那么一段时间就有人在那里问,而且一般也得不到正确的答案,因此,我还是画蛇添足,共享一下这些调用的苦力活吧。
用户1138785
2019/09/11
1.8K0
将图像转换为JPG或GIF字节流。
图像处理常用插值方法总结
在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要依据邻近象素的值来对该坐标进行插值。比如:做地图投影转换,对目标图像的一个象素进行坐标变换到源图像上对应的点时,变换出来的对应的坐标是一个小数,再比如做图像的几何校正,也会碰到同样的问题。以下是对常用的三种数字图像插值方法进行介绍。 1、最邻近元法   这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐
智能算法
2018/04/03
4K0
图像处理常用插值方法总结
图像插值
算法:图像插值是在基于模型框架下,从低分辨率图像生成高分辨率图像的过程,用以恢复图像中所丢失的信息。图像常见的插值算法可以分为两类:自适应和非自适应,如最近邻插值,双线性插值,双平方插值,双立方插值以及其他高阶方法等,应用于军事雷达图像、卫星遥感图像、天文观测图像、地质勘探数据图像、生物医学切片及显微图像等特殊图像及日常人物景物图像的处理。
裴来凡
2022/05/28
7220
图像插值
浅谈彩色图像、灰度图像、二值图像和索引图像区别
彩色图像:每个像素由R、G、B三个分量表示,每个通道取值范围0~255。数据类型一般为8位无符号整形。
种花家的奋斗兔
2020/11/12
5.6K0
C#可空值类型
1. 可空类型修饰符(?)   引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。   例如:string str=null; 是正确的,int i=null; 编译器就会报错。
_一级菜鸟
2021/08/10
1.4K0
用matlab绘制函数图像例题_matlab绘制方程组图像
比如f(x,y)=-((x^2+y-1).^2+(x+y^2-7)^2)/200+10
全栈程序员站长
2022/10/04
8910
用matlab绘制函数图像例题_matlab绘制方程组图像
根据key 从yml 获取具体值的工具类
这里写目录标题 1 工具类 1 工具类 public class YamlUtil { // public static final YamlUtil instance = new YamlUtil(); private static Map<String, Map<String, Object>> ymlMap = new HashMap<>(); static { Yaml yaml = new Yaml(); try (InputStrea
一写代码就开心
2022/08/16
2.7K0
图像二值化-局部阈值方法汇总
概述: 在图像处理中二值图像处理与分析是图像处理的重要分支,图像二值分割尤为重要,有时候基于全局阈值自动分割的方法并不能准确的将背景和对象二值化,这个时候就需要使用局部的二值化方法。常见的图像二值化局
OpenCV学堂
2018/04/04
9K0
图像二值化-局部阈值方法汇总
Android根据资源名获取资源ID
接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨率,语言等不同资源显式指定。
技术小黑屋
2018/09/04
3.5K0
[IJCAI | 论文简读] 图像重建的残差对比学习:从噪声图像中学习可转移表示
Residual Contrastive Learning for Image Reconstruction: Learning Transferable Representations from Noisy Images
智能生信
2022/12/29
5750
[IJCAI | 论文简读] 图像重建的残差对比学习:从噪声图像中学习可转移表示
【从零学习OpenCV 4】图像二值化
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/11/27
9960
【从零学习OpenCV 4】图像二值化
matlab习题 —— 图像绘制练习
一、题目 (1) 读取附件1 sd.xlsx,以相邻两列数据绘制散点图并标注;以第 1,2,4 列数据绘制空间散点图 (2) 根据下面图形写出作图语句 ① y=sinx , y=cosx 在同一幅图; ② y=sinx , y=cosx 在同一幅图不同窗口 (3) 数组 [2,5,10,12,13,7,2,10,4,6,8,8,4,7,8] 作竖直、水平、立体柱状图、饼状图 (4) 绘制空间曲线 x=e^{0.3t}sint , y=e^{0.3t}cost , z=e^{0.3
繁依Fanyi
2023/05/07
7400
matlab习题 —— 图像绘制练习
【python图像处理】python绘制
3D图形在数据分析、数据建模、图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何使用python进行3D图形的绘制,包括3D散点、3D表面、3D轮廓、3D直线(曲线)以及3D文字等的绘制。
py3study
2020/01/10
1.5K0
【python图像处理】python绘制
点击加载更多

相似问题

获取可绘制的图像ID

14

从可绘制路径获取图像

31

如何从可绘制的图像中获取唯一id !!.

12

从资源id获取可绘制对象时的相同图像

10

从可绘制的动态获取图像

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文