【问题标题】:Is there any way to refactor this code or re-write it in a compact form?有没有办法重构这段代码或以紧凑的形式重写它?
【发布时间】:2013-05-04 16:30:10
【问题描述】:

我正在开发一个在图像上产生图像效果的 android 应用程序。 下面是我的应用程序的快照:

如您所见,在底部 - 有一个水平滚动条,当用户触摸水平滚动条上的图像之一时,上面的图像会产生相同的效果。

我总共有 26 个图像效果,因此水平滚动条中有 26 个图像。现在,在我的代码中,我必须找到所有这些图像并将它们的 onClickListener() 设置为一个特定的侦听器。

我正在通过以下方式完成任务:

    sepiaGreenishImage      = (ImageView) findViewById(R.id.sepiaGreenish);
    embossImage             = (ImageView) findViewById(R.id.emboss);
    sharpenImage            = (ImageView) findViewById(R.id.sharpen);
    slightYellowishImage    = (ImageView) findViewById(R.id.ligth_yellow);
    slightBluishImage       = (ImageView) findViewById(R.id.light_blue);
    slightReddishImage      = (ImageView) findViewById(R.id.light_red);
    slightGreenishImage     = (ImageView) findViewById(R.id.light_green);
    negativeImage           = (ImageView) findViewById(R.id.negative);
    greyScaleImage          = (ImageView) findViewById(R.id.greyscale);
    tintSeventyImage        = (ImageView) findViewById(R.id.tint_at_70);
    tintThirtyImage         = (ImageView) findViewById(R.id.tint_at_30);
    snowImage               = (ImageView) findViewById(R.id.snow);
    darkImage               = (ImageView) findViewById(R.id.darken);
    noiseImage              = (ImageView) findViewById(R.id.noise);
    flipImage               = (ImageView) findViewById(R.id.flip);
    rotateImage             = (ImageView) findViewById(R.id.rotate);
    gaussianBlurImage       = (ImageView) findViewById(R.id.blur);
    reddishImage            = (ImageView) findViewById(R.id.reddish);
    bluishImage             = (ImageView) findViewById(R.id.bluish);
    greenishImage           = (ImageView) findViewById(R.id.greenish);
    blackFilterImage        = (ImageView) findViewById(R.id.black_filter);
    increasedSepiaImage     = (ImageView) findViewById(R.id.increased_sepia);
    spiaBluishImage         = (ImageView) findViewById(R.id.sepia_bluish);
    brightImage             = (ImageView) findViewById(R.id.brighten);
    mirrorImage             = (ImageView) findViewById(R.id.mirror); 

然后按照下面的方式,我在设置onClickListener:

    sepiaGreenishImage.setOnClickListener(this);
    embossImage.setOnClickListener(this);
    sharpenImage.setOnClickListener(this);
    slightYellowishImage.setOnClickListener(this);
    slightBluishImage.setOnClickListener(this);
    slightReddishImage.setOnClickListener(this);
    slightGreenishImage.setOnClickListener(this);
    negativeImage.setOnClickListener(this);
    greyScaleImage.setOnClickListener(this);
    tintSeventyImage.setOnClickListener(this);
    tintThirtyImage.setOnClickListener(this);
    snowImage.setOnClickListener(this);
    darkImage.setOnClickListener(this);
    noiseImage.setOnClickListener(this);
    flipImage.setOnClickListener(this);
    rotateImage.setOnClickListener(this);
    gaussianBlurImage.setOnClickListener(this);
    reddishImage.setOnClickListener(this);
    bluishImage.setOnClickListener(this);
    greenishImage.setOnClickListener(this);
    blackFilterImage.setOnClickListener(this);
    increasedSepiaImage.setOnClickListener(this);
    spiaBluishImage.setOnClickListener(this);
    brightImage.setOnClickListener(this);
    mirrorImage.setOnClickListener(this);

现在,我的问题是如何应用任何类型的重构?因为我经常重复自己。任何类型的 foreach 循环或类似的东西都可能对我有很大帮助!

【问题讨论】:

  • 把ID放到一个集合中,为每个ID创建图片,设置点击监听?什么最有意义取决于您如何使用它们。
  • 在布局xml中设置OnClickListener怎么样?
  • @vmironov 我可以在 XML 布局中引用我的类的当前实例-this 吗?如果是这样,怎么做?如果您在 stackoverflow.com 上向我提供类似的问题(关于在 XML 中设置 onClickListener),那将是一种乐趣!
  • @ArslanAli,你可以指定一个方法名,当ImageView被点击时应该被调用。你可以在这里找到更详细的信息android:onClick vs setOnClickListener

标签: java android refactoring


【解决方案1】:

要以编程方式执行此操作,您可以执行以下操作:

ViewGroup buttonGroup = (ViewGroup) findViewById(R.id.image_effect_buttons);
for (int i = 0; i < buttonGroup.getChildCount(); i++) {
    ImageView imageView = (ImageView) buttonGroup.getChildAt(i);
    imageView.setOnClickListener(this);
}

其中“image_effect_buttons”是包含这些图像按钮的任何视图(猜测是 LinearLayout?)的 id。请注意,如果该 ViewGroup 包含除您要将此侦听器附加到的 ImageView 之外的任何其他子级,这将导致问题,但这是避免显式枚举它们的最简单方法。

【讨论】:

    【解决方案2】:

    遍历 Arrays.asList(obj1, obj2, obj3...) 并在 for 循环中执行一次。

    【讨论】:

      【解决方案3】:

      使用 ViewPager 与水平滚动视图相比可能会更好。使用 ViewPager 解决方案的优点是您可以在运行时回收视图并设置属性。

      一个典型的设置包括:

      • ViewPager 在布局中声明
      • 某种类型的模型类,用于保存与每个图像设置相关的所有内容
      • 一个片段,可以包含三个图像视图或带有可绘制对象的单选按钮组等
      • 一个 PagerAdapter 包含片段和模型的数组列表

      这似乎是更多的代码,但当需要更改数据或进行任何重构时,它肯定更具可扩展性。在更改项目时,您还可以获得酷炫的 android 页面“swoosh”。

      参考:http://developer.android.com/training/implementing-navigation/lateral.html#horizontal-paging

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2013-11-15
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多