各种活动在一个布局中使用相同的视图 - 如何重构?

时间:2016-02-23 17:36:28

标签: android

我有六个这样的活动。我试图制作包含ImageViews的自定义活动,因此我不必在每个活动中重复自己。我应该保留原样,还是可以让它以某种方式放在一个地方让所有人使用(比如布局是 - 它只是一个并且有效):

public class ActivityOne extends AppCompatActivity implements View.OnClickListener {

    @Bind(R.id.iv1) ImageView iv1;
    @Bind(R.id.iv2) ImageView iv2;
    @Bind(R.id.iv3) ImageView iv3;
    @Bind(R.id.iv4) ImageView iv4;
    @Bind(R.id.iv5) ImageView iv5;
    @Bind(R.id.iv6) ImageView iv6;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        iv1.setImageDrawable(getResources().getDrawable(R.drawable.c1));
        iv2.setImageDrawable(getResources().getDrawable(R.drawable.c2));
        iv3.setImageDrawable(getResources().getDrawable(R.drawable.c3));
        iv4.setImageDrawable(getResources().getDrawable(R.drawable.c4));
        iv5.setImageDrawable(getResources().getDrawable(R.drawable.c5));
        iv6.setImageDrawable(getResources().getDrawable(R.drawable.c6));
}   

3 个答案:

答案 0 :(得分:1)

您可以创建一个抽象的BaseActivity活动,该活动将具有这些活动共有的所有功能,然后您可以使用需要具有该常用功能的其他活动进行扩展

或者您只需使用一个活动并使用某种切换语句维护其中的所有状态,这取决于您的要求

答案 1 :(得分:1)

您可以创建一个需要覆盖某些方法的抽象活动ImageryActivty,例如提供布局ID的getContentView

public abstract class ImageryActivity extends AppCompatActivity {

  @Bind(R.id.iv1) ImageView iv1;
  @Bind(R.id.iv2) ImageView iv2;
  @Bind(R.id.iv3) ImageView iv3;
  @Bind(R.id.iv4) ImageView iv4;
  @Bind(R.id.iv5) ImageView iv5;
  @Bind(R.id.iv6) ImageView iv6;

  public abstract int getContentView();

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(getContentView());
    ButterKnife.bind(this);

    iv1.setImageDrawable(getResources().getDrawable(R.drawable.c1));
    iv2.setImageDrawable(getResources().getDrawable(R.drawable.c2));
    iv3.setImageDrawable(getResources().getDrawable(R.drawable.c3));
    iv4.setImageDrawable(getResources().getDrawable(R.drawable.c4));
    iv5.setImageDrawable(getResources().getDrawable(R.drawable.c5));
    iv6.setImageDrawable(getResources().getDrawable(R.drawable.c6));
  }   

}

您的孩子活动必须继承这一项:

public class ActivityOne extends ImageryActivity {

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  public int getContentView() {
    return R.layout.activity_one;
  }

}

当然,这种布局必须包含具有正确id的所有ImageView。为此,我建议您创建一个可重复使用的布局imagery_layout并将其包含在您的每个子活动中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <include
    layout="@layout/imagery_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

  <!-- And here it comes the content for this particular activity in case there's one -->

</LinearLayout>

答案 2 :(得分:0)

您应该可以使用一个活动执行此操作。您可以将参数作为Intent extras传递给Activities。在Activity中定义一些String常量:

public static final String ARG_IN_IMAGE_ONE = "ActivityOne.ImageOne";
public static final String ARG_IN_IMAGE_TWO = "ActivityOne.ImageTwo";
...

在创建意图时设置Drawable ID:

intent.putIntExtra(ARG_IN_IMAGE_ONE, R.drawable.c1);
...

从onCreate的意图中读取:

iv1.setImageDrawable(getResources().getDrawable(getIntent().getIntExtra(ARG_IN_IMAGE_ONE)));
...

您还可以选择创建一个静态构建器,它可以获取6个图像ID并返回Intent。