你所不知道的Fragment的妙用
2017-07-07-11-49-15.gif
- 在軟件開發(fā)中登陸功能是十分常見重要的,就以此為例說明fragment的一種用法,讓開發(fā)變得更自如
1.這個(gè)用法的原因和意義
- 在未登錄情況下,點(diǎn)擊很多地方都可能要跳到登陸界面,登陸成功后,當(dāng)前頁面需要刷新
- 我們的一般做法是StartActivityForResult,在登陸成功后,SetResultOK,finsh登陸頁面。 在當(dāng)前Activity或者fragment的OnActivityResult中根據(jù)RequestCode和ResultCode來判斷登陸是否成功來刷新界面
- 由于要登陸的地方很多,重復(fù)在不同的Activity或Fragment中重寫OnactivityResult是個(gè)很頭痛的事,甚至有時(shí)后我們?cè)赼dapter或者dialog等中要獲取這個(gè)登陸的回調(diào)是很麻煩的,數(shù)據(jù)要傳來傳去,用EVenbus也不能簡化我們的操作
- 有沒有辦法讓我們,像設(shè)置OnClickListener這樣直接獲得登陸回調(diào)?
2.先看看用法
在任何需要登陸的地方調(diào)用我們?cè)赨tils中寫的一個(gè)靜態(tài)方法
一次寫好從此輕松調(diào)用
ActivityUtils.startLogin(this, new ActivityUtils.ActivityResultListner() {
@Override
public void loginsuccess() {
((Button)v).setText("您已登陸");
}
@Override
public void logincancel() {
Toast.makeText(MainActivity.this,"您已取消登陸",0).show();
}
});
3.實(shí)現(xiàn)的方式
- 利用fragment擁有和activity同步的生命周期
- frament中可以收到OnActivityResult的回調(diào)
- 定義回調(diào)接口
//用abstract class我們?cè)诓恍枰猚ancel回掉時(shí)可以不重寫
public abstract static class ActivityResultListner {
public void loginsuccess() {
}
public void logincancel() {
}
}
2.先定義一個(gè)fragment用于處理回調(diào)
public static class MyFragment extends Fragment {
public static final int LOGIN = 123;
ActivityResultListner listener;
public void setListener(ActivityResultListner listener) {
this.listener = listener;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOGIN) {
if (resultCode == RESULT_OK) {
if (listener != null)
listener.loginsuccess();
} else {
if (listener != null)
listener.logincancel();
}
}
}
- 回調(diào)的實(shí)現(xiàn)
- 傳進(jìn)的Context 要是FragmentActivity的子類
實(shí)際中
AppcomatActivity Fragment.getActivity()都是滿足這個(gè)要求的 - 先把frament添加到activity
- 根據(jù)fragment的onActivityResult獲取回調(diào)
public static void startLogin(FragmentActivity context, ActivityResultListner listener) {
//先看activity是否添加過該fragment, 添加根據(jù)Tag找出 ,沒有就添加
FragmentManager manager = context.getSupportFragmentManager();
MyFragment myFragment = null;
Fragment loginf = manager.findFragmentByTag(MyFragment.LOGIN + "");
if (loginf == null) {
myFragment = new MyFragment();
manager.beginTransaction().add(myFragment, MyFragment.LOGIN + "").commit();
//這句是讓commit立即生效,不然運(yùn)行會(huì)報(bào)錯(cuò),fragment還沒有被attach
manager.executePendingTransactions();
} else {
myFragment = (MyFragment) loginf;
}
//設(shè)置監(jiān)聽
myFragment.setListener(listener);
Intent intent = new Intent(context, loginActivity.class);
myFragment.startActivityForResult(intent, MyFragment.LOGIN);
}
4.總結(jié)
- 利用了fragment和activity相同的生命周期,用同樣的方法可以做很多事情,比如申請(qǐng)權(quán)限等
- 第一次麻煩從此輕松調(diào)用,希望對(duì)各位有所幫助!