前言
在上一篇文章我们讲过,我们可以通过定制实现不同版本使用不同的资源文件,那么是否也可以定制不同的java源代码呢?可以的,难度不大,只是步骤稍微比只定制资源文件繁琐点。
定制须知
虽然定制和构建类型中的字符串和布局资源与main源码集中的值会相应的覆盖,java类却又不同。如果main源码集中的代码引用了一个特定的类每个定制和构建类型可以有自己的实现,只要在main中没有就行。
定制流程
- 我们对上一篇文章中的SecondActivity进行定制。如上所说,如要定制java代码,需要在每个定制类型中自己实现,并且main中不可以存在该代码。所以,我们要定制SecondActivity,需要在定制版本的包下自己实现SecondActivity,并且删掉main文件夹中的SecondActivity。(如果不需要定制java代码,只定制资源文件的话,不需要在每个定制包里自己实现java代码,不需要删除main文件夹下代码,默认走main文件夹下的java代码)。为了演示定制java代码,我将main文件夹下的SecondActivity删除,并将其连带package一同复制到每个定制的文件夹下,项目结构如下:
我们接下来对customtwo进行定制。customone为我们上一篇文章定制过资源文件的项目,customthree则是我们没经过任何定制的原始版本代码。 - 定制SecondActivity,我这里为了方便演示,并没有改变太多,只是给ImageView一个Id,然后给它一个点击监听,点击进行吐司。xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SecondActivity">
<TextView
android:layout_marginTop="40dp"
android:layout_gravity="center_horizontal"
android:id="@+id/tv_second_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/secondpage"
/>
<TextView
android:id="@+id/tv_second_next"
android:padding="10dp"
android:background="#cf1414"
android:layout_marginTop="40dp"
android:layout_gravity="center_horizontal"
android:text="Go To Thrid Page"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/imgv_meizi"
android:layout_gravity="center_horizontal"
android:src="@mipmap/img_meizi"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
定制过的java代码如下:
public class SecondActivity extends AppCompatActivity {
private TextView mTvSecondName;
private TextView mTvSecondNext;
private ImageView mImgvMeizi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mTvSecondName = (TextView) findViewById(R.id.tv_second_name);
mTvSecondNext = (TextView) findViewById(R.id.tv_second_next);
mTvSecondNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,ThridActivity.class);
startActivity(intent);
}
});
mImgvMeizi = (ImageView) findViewById(R.id.imgv_meizi);
mImgvMeizi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SecondActivity.this, "我是妹子", Toast.LENGTH_SHORT).show();
}
});
}
}
与customone的SecondActivity相比,我们在customtwo中只是给ImageView设置了监听,点击吐司。
只此两步,java代码定制完成。
定制效果
定制完成,我们可以看看customtwo的效果,如图:
可见我们单独对customtwo的SecondActivity进行了定制,customone和customthree的效果并没有受到任何影响。
总结
Android产品定制总体来说并不难,只是我们平时用得少可能相关技能会被大家忽略。在此将相关方法分享出来,希望能够对大家有所帮助。
代码地址:https://github.com/tangxuesong6/productCustom.git