Android 不同的活动从一个布局中使用相同的视图-如何重构?

Android 不同的活动从一个布局中使用相同的视图-如何重构?,android,Android,我有六个这样的活动。我尝试创建包含ImageViews的自定义活动,这样我就不必在每个活动中重复自己。我应该让它保持原样,还是我可以把它放在一个地方,让每个人都使用它(就像布局一样——它只是一个,而且有效): 您可以创建一个抽象的BaseActivity活动,该活动将具有这些活动所共有的所有功能,然后您可以使用它扩展需要具有该公共功能的其他活动 或者,您可以简单地使用一个活动,并使用某种类型的开关语句维护其中的所有状态。所有这些都取决于您的需求。您可以创建一个抽象活动ImageryActivty

我有六个这样的活动。我尝试创建包含ImageViews的自定义活动,这样我就不必在每个活动中重复自己。我应该让它保持原样,还是我可以把它放在一个地方,让每个人都使用它(就像布局一样——它只是一个,而且有效):


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


或者,您可以简单地使用一个活动,并使用某种类型的开关语句维护其中的所有状态。所有这些都取决于您的需求。

您可以创建一个抽象活动
ImageryActivty
,该活动需要覆盖一些方法,如
getContentView
,该方法提供一个布局id:

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。为此,我建议您创建一个可重用的布局
images\u布局
,并将其包含在您的每个孩子活动中:

<?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>

您应该可以通过一个活动完成此操作。您可以将参数作为意图附加项传递给活动。在“活动”中定义一些字符串常量:

public static final String ARG_IN_IMAGE_ONE = "ActivityOne.ImageOne";
public static final String ARG_IN_IMAGE_TWO = "ActivityOne.ImageTwo";
...
在创建意图时设置可绘制ID:

intent.putIntExtra(ARG_IN_IMAGE_ONE, R.drawable.c1);
...
并阅读onCreate中的意图:

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

您还可以选择创建一个静态生成器,它接受6个图像ID并返回意图。

谢谢!这就是我想要的——我甚至可以不使用
getContentView()
,因为我在每个活动中都有相同的布局。
iv1.setImageDrawable(getResources().getDrawable(getIntent().getIntExtra(ARG_IN_IMAGE_ONE)));
...