前言
今天給大家?guī)硪黄恼率潜救嗽陂喿x網(wǎng)絡(luò)上一些比較好的項(xiàng)目的源碼時(shí)發(fā)現(xiàn)的,覺得還不錯(cuò),所以就記錄下來。我們平時(shí)要開啟一個(gè)activity一般都是直接
Intent intent = new Intent(this,XXXAcvitity.class);
//如果有參數(shù)
intent.putExtra("name","lxt");
startActivity(intent);
想必很多小伙伴都是這樣做的吧,這樣做看似沒什么問題,但是在另外一個(gè)activity里面找參數(shù),是不是還要回到打開他的地方找,項(xiàng)目小點(diǎn)還好,一旦多起來了,改起來就會(huì)非常麻煩,那么接下來給大家?guī)硪粋€(gè)個(gè)人認(rèn)為比較好的辦法。
正文
上面也說到了,我們?nèi)绻凑諅鹘y(tǒng)的方式做,找參數(shù)改參數(shù)的時(shí)候就會(huì)特別不方便,那么怎么做呢?我們可以在需要打開的activity里面定義一個(gè)靜態(tài)方法,起名就叫start,如果需要參數(shù),直接在后面增加參數(shù)就好了,比如:
public class SecondActivity extends AppCompatActivity {
private static final String NAME = "NAME";
//在需要打開的activity里面定義一個(gè)方法,參數(shù)列表為打開該activity需要的參數(shù)
public static void start(Context context, String name) {
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra(NAME, name);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在需要用參數(shù)的地方
String name = getIntent().getStringExtra(NAME);
}
}
寫完之后,在另外一個(gè)activity打開該activity的時(shí)候就可以這么寫
SecondActivity.start(this,"lxt");
這樣寫的好處是什么呢?首先肯定是簡(jiǎn)潔啊,不管你需不需要參數(shù),都是一行代碼,再然后就是擴(kuò)展性強(qiáng),比方說,我們現(xiàn)在要增加一個(gè)參數(shù)了,那么我們完全可以直接在SecondActivity里面增加一個(gè)參數(shù),如果這個(gè)參數(shù)不是必須的話,我們完全可以利用方法重載來完成,從而不需要修改以前的代碼,比如
//在需要打開的activity里面定義一個(gè)方法,參數(shù)列表為打開該activity需要的參數(shù)
public static void start(Context context, String name) {
//調(diào)用3個(gè)參數(shù)的方法
start(context, name, 0);
}
//只需要增加一個(gè)方法,然后之前的2個(gè)參數(shù)調(diào)用3個(gè)參數(shù)的就好了
public static void start(Context context, String name, Integer age) {
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra(NAME, name);
intent.putExtra(AGE, age);
context.startActivity(intent);
}
對(duì)我們之前的代碼沒有任何影響,提高了代碼的可擴(kuò)展性,而且需要什么參數(shù),什么類型一目了然,所以把這種方式推薦給大家使用。
福利
給大家?guī)硪稽c(diǎn)小福利,當(dāng)然如果大家已經(jīng)在用了就當(dāng)我沒說,findViewById()這個(gè)方法每個(gè)Android開發(fā)程序猿肯定都敲過,雖說現(xiàn)在有很多框架,比如XUtils,ButterKnife之類的,利用注解的方式找控件,雖說我們不用一行一行敲findViewById了,但是他們底層都是利用的反射來做的,會(huì)影響我們App的性能,所以為了性能,還是推薦大家用findViewById,這個(gè)時(shí)候大家就說,findViewById還要強(qiáng)轉(zhuǎn),蠻麻煩,別著急,給大家來帶一點(diǎn)小干貨
//在我們的BaseActivity里面增加一個(gè)方法
protected <T extends View> T findView(int resId) {
return (T) (findViewById(resId));
}
//在子類中使用
TextView textview = findView(R.id.tv);
這樣用起來比我們用傳統(tǒng)的findViewById是要快一些的,當(dāng)然,如果你還不愿意寫,OK,給你們推薦一個(gè)自動(dòng)生成findViewById的插件,GenerateFindViewById,這里我就不演示了,想了解的小伙伴github搜就好了。