Throwable類中的getStackTrace()方法,根據這個方法能夠獲得函數的逐層調用地址,其返回值爲StackTraceElement[],而在StackTraceElement類中有四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調試程序打印Log時很是有用。android
try {
int num = 1 / 0;
} catch (Exception e) {
e.printStackTrace();
StackTraceElement[] stackTrace = e.getStackTrace();
for (StackTraceElement element : stackTrace) {
String className = element.getClassName();
int lineNumber = element.getLineNumber();
String fileName = element.getFileName();
String methodName = element.getMethodName();
Log.e("TAG", "fileName:" + fileName + " lineNumber:" + lineNumber + " className:" + className + " methodName" + methodName);
}
}
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = CrashHandler.class.getSimpleName();
private Context mContext;
private static volatile CrashHandler instance;
private Thread.UncaughtExceptionHandler defalutHandler;
private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss.SSS", Locale.CHINA);git
private CrashHandler() {
}web
/**
* 得到單例 * @return 單例
*/
public static CrashHandler getInstance() {
if (instance == null) {
synchronized (CrashHandler.class) {
if (instance == null) {
instance = new CrashHandler();
}
}
}
return instance;
}算法
public void init(Context context) {
mContext = context.getApplicationContext();
defalutHandler = Thread.getDefaultUncaughtExceptionHandler(); // 獲取系統默認的UncaughtException處理器
Thread.setDefaultUncaughtExceptionHandler(this); // 設置該CrashHandler爲程序的默認處理器
}數據庫
@Override
public void uncaughtException(Thread thread, Throwable ex) {
boolean hasHandle = handleException(ex); //是否處理
if (!hasHandle && defalutHandler != null) {
defalutHandler.uncaughtException(thread, ex); //若是用戶沒有處理則讓系統默認的異常處理器來處理
} else {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Log.e(TAG, "error : ", e);
}
android.os.Process.killProcess(android.os.Process.myPid());
system.exit(1);
}
}canvas
private boolean handleException(final Throwable ex) {
if (ex == null) {
return false;
}
new Thread() {
@Override
public void run() {
Looper.prepare();
}
ex.printStackTrace();
String err = "[" + ex.getmessage() + "]";
Toast.makeText(mContext,"程序出現異常,5秒後自動退出",Toast.LENGTH_LONG).數組
show();
Looper.loop();
}.start();瀏覽器
String str = collectDeviceInfo(ex); // 收集設備參數信息,日誌信息 緩存
saveCrashInfoToFile(str); // 保存日誌文件
return true;
}安全
/**
* 收集設備信息,日誌信息 * @param ex Throwable * @return 收集的信息
*/
private String collectDeviceInfo(Throwable ex) {
Log.e(TAG, "collectDeviceInfo:" + ex.getMessage());
StringBuilder builder = new StringBuilder();
return builder.toString();
}
/**
* 保存出錯信息 * @param error 待保存的出錯信息
*/
private void saveCrashInfoToFile(String error) {
Log.e(TAG, "saveCrashInfoToFile:" + error);
}
}
程序入口進行初始化,以後未捕獲的異常均由此類處理。
CrashHandler.getInstance().init(this);
Resources類中的getIdentifier(name, defType, defpackage)方法,根據資源名稱獲取其ID,作UI時常常用到。
好比得到主佈局的idResourcesUtil.getResourceId(getApplicationContext(),"activity_main",ResourcesUtil.LAYTOUT);
android.text.format.Formatter類中formatFileSize(Context, long)方法,用來格式化文件大小(B → KB → MB → GB)
android.text.format.Formatter.formatFileSize(getApplicationContext(),1024); //返回1.00KB
android.media.ThumbnailUtils類,用來獲取媒體(圖片、視頻)縮略圖,該類從Android 2.2開始系統新增,不向下兼容
/** * 建立一張視頻的縮略圖 * 若是視頻已損壞或者格式不支持可能返回null * *
@param filePath 視頻文件路徑 如:/sdcard/android.3gp *
@param kind kind能夠爲MINI_KIND或MICRO_KIND * */
ThumbnailUtils.createVideoThumbnail(filePath,kind);
/** * * 建立一個指定大小的縮略圖 *
@param source 源文件(Bitmap類型) *
@param width 壓縮成的寬度 *
@param height 壓縮成的高度 */
ThumbnailUtils.extractThumbnail(source , width, height);
/** * 建立一個指定大小居中的縮略圖 * *
@param source 源文件(Bitmap類型) *
@param width 輸出縮略圖的寬度 *
@param height 輸出縮略圖的高度 *
@param options 若是options定義爲OPTIONS_RECYCLE_INPUT,則回收@param source這個資源文件 * (除非縮略圖等於@param source) * */
ThumbnailUtils.extractThumbnail(source , width, height,options);
格式化字符串,可使用String類的format(String,Object…)方法,若是要格式化資源文件strings.xm
TextUtils類中的isEmpty(String)方法,判斷字符串是否爲null或」「,不要再本身寫判斷字符串非空的代碼了。
String str = null; String str1 = "";
String str2 = "a";
Log.e("TAG", TextUtils.isEmpty(str)+" "+TextUtils.isEmpty(str1)+" "+TextUtils.isEmpty(str2)); //輸出true true false
相似的方法還有TextUtils.isDigitsOnly()是不是純數字
View類中的getDrawingCache()等一系列方法,目前只知道能夠用來截圖
/**
* / 獲取指定Activity的截屏,保存到png文件 * * @param activity activity * @return 截屏Bitmap
*/
private static Bitmap takeScreenShot(Activity activity) { // View是你須要截圖的
View View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
// 獲取狀態欄高度
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
Log.i("TAG", "" + statusBarHeight);
// 獲取屏幕長和高
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay().getHeight();
Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
view.destroyDrawingCache();
return b;
}
System類中的arraycopy(src, srcPos, dest, destPos, length)方法,用來copy數組;Arrays.copyOf()裏的一系列方法也是間接調用System.arraycopy()方法
Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時貌似Fragment的其它生命週期方法都不會被調用
調用hide或者show你就會發現fragment的生命週期不走了!onPause方法不調用了!onResume只調用一次!這時此時方法onHiddenChanged派上用場
當fragment隱藏時,該方法會調用傳入參數爲true表示該fragment被隱藏了, 當fragment調用了show方法後,該方法傳入的參數爲false,表示該fragment正在顯示
因此總結起來,若是使用hide/show方法來控制fragment的使用時,本來須要在onResume以及onPause方法作的事情就能夠遷移到onHiddenChanged時進行管理
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
this.onPause();
} else {
this.onResume();
}
}
Activity類中的onWindowFocusChanged(boolean)方法,使用一個view的getWidth() getHeight() 方法來獲取該view的寬和高,返回的值卻爲0。
若是這個view的長寬很肯定不爲0的話,那極可能是你過早的調用這些方法,也就是說在這個view被加入到rootview以前你就調用了這些方法,返回的值天然爲0.,解決該問題的方法有不少,主要就是延後調用這些方法。能夠試着在onWindowFocusChanged()裏面調用這些方法。
View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置
TextView tv= (TextView) findViewById(R.id.tv); int loc[]=new int[2]; tv.getLocationInWindow(loc); Log.e("TAG",loc[0]+" "+loc[1]);
TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現「顯示密碼」功能;
TextView tv= (TextView) findViewById(R.id.tv); tv.setText("123456"); tv.setTransformationMethod(PasswordTransformationMethod.getInstance());
TextView.setError() 在驗證用戶輸入的時候很棒
Linkify.addLinks() 在Text上添加連接。很實用。好比將TextView中的超連接識別爲可點擊進入瀏覽器的連接。
TextView tv= (TextView) findViewById(R.id.tv); Linkify.addLinks(tv,Linkify.WEB_URLS);
ListView或GridView類中的setFastScrollEnabled(boolean)方法,用來設置快速滾動滑塊是否可見,固然前提是item夠多
PageTransformer接口,用來自定義ViewPager頁面切換動畫,用setPageTransformer(boolean, PageTransformer)方法來進行設置
Activity類中的onNewIntent(intent)方法,具體看這篇文章Android:onNewIntent()觸發機制及注意事項
Html.fromHtml() 用於生成一個Html,參數能夠是一個字符串.可是它不是很快,因此不要常常去用.取而代之的是請手動構建 Spannable 來替換 Html.fromHtml,可是它對渲染從 web 上獲取的文字仍是很不錯的。
Build.version_CODES 這個標明瞭當前的版本號,在處理兼容性問題的時候常常會用到.點進去能夠看到各個版本的不一樣特性
ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保證全部觸摸是的交互都統一的。
這個方法獲取的值表示:用戶的手滑動這個距離後,才斷定爲正在進行滑動.固然這個值也能夠本身來決定.可是爲了一致性,仍是使用標準的值較好。
PhoneNumberUtils.convertKeypadLettersToDigits 顧名思義.將字母轉換爲數字,相似於T9輸入法
String abcd = PhoneNumberUtils.convertKeypadLettersToDigits("abcd"); Log.e("TAG",abcd); //結果爲2223
Context.getCacheDir() 獲取緩存數據文件夾的路徑,這個路徑一般在SD卡上(這裏的SD卡指的是廣義上的SD卡,包括外部存儲和內部存儲)Adnroid/data/您的應用程序包名/cache/ 下面.測試的時候,能夠去這裏面看是否緩存成功.緩存在這裏的好處是:不用本身再去手動建立文件夾,不用擔憂用戶把本身建立的文件夾刪掉,在應用程序卸載的時候,這裏會被清空,使用第三方的清理工具的時候,這裏也會被清空。
ArgbEvaluator 用於處理顏色的漸變。在使用動畫的時候可能用的比較多。能夠看下他的實現
public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (int) ((startA + (int) (fraction * (endA - startA))) << 24) | (int) ((startR + (int) (fraction * (endR - startR))) << 16) | (int) ((startG + (int) (fraction * (endG - startG))) << 8) | (int) ((startB + (int) (fraction * (endB - startB))));
}
Space 它是Android 4.0中新增的一個控件,它實際上能夠用來分隔不一樣的控件,其中造成一個空白的區域.這是一個輕量級的視圖組件,它能夠跳過Draw,對於須要佔位符的任何場景來講都是很棒的。
<Space android:layout_width="match_parent" android:layout_height="10dp"/>
ValueAnimator.reverse() 用在動畫中,將動畫逆向。
EditText類的setKeyListener(KeyListener)方法,設置DigitsKeyListener類將只能輸入數字,經過DigitsKeyListener.getInstance(String accepted)方法便可指定EditText可輸入的字符集。
DateUtils.formatDateTime() 用來進行區域格式化工做,輸出格式化和本地化的時間或者日期。
android.text.format.DateUtils.formatDateTime(getApplicationContext(),System.currentTimeMillis(), DateUtils.FORMAT_SHOW_DATE|DateUtils.FORMAT_SHOW_YEAR|DateUtils.FORMAT_SHOW_TIME);
StaticLayout 在自定義 View 中渲染文字的時候很實用。
使用Canvas的drawText繪製文本是不會自動換行的,即便一個很長很長的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕以外。能夠逐個計算每一個字符的寬度,經過必定的算法將字符串分割成多個部分,而後分別調用drawText一部分一部分的顯示, 可是這種顯示效率會很低。
StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經實現了文本繪製換行處理
Activity.onBackPressed() 很方便的管理back鍵的方法,有時候須要本身控制返回鍵的事件的時候,能夠重寫一下。好比加入 「點兩下back鍵退出」 功能。
GestureDetector 用來監聽和相應對應的手勢事件,好比點擊,長按,慢滑動,快滑動,用起來很簡單,比你本身實現要方便許多。
ViewStub 它是一個初始化不作任何事情的 View,可是以後能夠載入一個佈局文件。在慢加載 View 中很適合作佔位符。
SystemClock.sleep() 這個方法在保證必定時間的 sleep 時很方便,一般用來進行 debug 和模擬網絡延時。
Fragment.setArguments,由於在構建 Fragment 的時候不建議加參數,因此這是個很好的東西,能夠在建立 Fragment 以前設置參數
DialogFragment.setShowsDialog () 這是一個很巧妙的方式,DialogFragment 能夠做爲Dialog顯示。
LocalBroadcastManager 這個會比全局的 broadcast 更加安全,簡單,快速。一個簡單的應用就是退出程序。
public class BaseApplication extends Application {
public final static String ACTION_EXIT_APP = "package.exit";
private static LocalBroadcastManager mLocalBroadcatManager;
private static Context mContext;
private static BaseApplication instance;
public static Context getContext() {
return mContext;
}
/**
* 得到LocalBroadcastManager對象 * @return LocalBroadcastManager對象
*/
public static LocalBroadcastManager getLocalBroadcastManager() {
if (mLocalBroadcatManager == null) {
mLocalBroadcatManager = LocalBroadcastManager.getInstance(mContext);
}
return mLocalBroadcatManager;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
mContext = this.getApplicationContext();
CorePageManager.getInstance().init(this);
}
/**
* 發送本地廣播退出程序
*/
public void exitApp() {
Intent intent = new Intent();
intent.setAction(ACTION_EXIT_APP);
intent.addCategory(Intent.CATEGORY_DEFAULT);
BaseApplication.getLocalBroadcastManager().sendBroadcast(intent);
BaseActivity.unInit();
}
}
public class BaseActivity extends FragmentActivity {
public final static String ACTION_EXIT_APP = "package.exit";
/** * 僅用於接受應用退出廣播,程序退出時有機會作一些必要的清理工做 */
private BroadcastReceiver mExitReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{ String action = intent.getAction();
if (action.equals(ACTION_EXIT_APP)) {
Log.d(TAG,"exit from broadcast"); finish();
}
}
};
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
IntentFilter filter = new IntentFilter();
filter.addAction(Config.ACTION_EXIT_APP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
BaseApplication.getLocalBroadcastManager().registerReceiver(mExitReceiver, filter); //註冊本地廣播,接收程序退出廣播
}
}
Application.registerActivityLifecycleCallbacks 就是註冊 Activity 的生命週期的一些回調方法,就是一個方便的工具
Application經過此接口提供了一套回調方法,用於讓開發者對Activity的生命週期事件進行集中處理。
以往若需監測Activity的生命週期事件代碼,你多是這樣作的,重寫每個Acivity的onResume(),而後做統計和處理。
@Override
protected void onResume() {
super.onResume(); //TODO 處理和統計代碼
Log.v(TAG, "onResume");
Logger.v(TAG, "onResume");
Logging.v(TAG, "onResume");
...
}
ActivityLifecycleCallbacks接口回調能夠簡化這一繁瑣過程,在一個類中做統一處理
android.app.Application.ActivityLifecycleCallbacks 它要求API 14+ (Android 4.0+),在咱們自定義的Application註冊回調。
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStopped(Activity activity) {
Logger.v(activity, "onActivityStopped");
}
@Override
public void onActivityStarted(Activity activity) {
Logger.v(activity, "onActivityStarted");
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
Logger.v(activity, "onActivitySaveInstanceState");
}
@Override
public void onActivityResumed(Activity activity) {
Logger.v(activity, "onActivityResumed");
}
@Override
public void onActivityPaused(Activity activity) {
Logger.v(activity, "onActivityPaused");
}
@Override
public void onActivityDestroyed(Activity activity) {
Logger.v(activity, "onActivityDestroyed");
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Logger.v(activity, "onActivityCreated");
}
});
};
這裏只是使用Log日誌工具做簡要測試,如需知足較複雜的統計或調試需求時,此法可能會大大減小插入代碼量,提升效率,更多詳情請看這個項目AndroidLifecyle
versionNameSuffix這個 gradle 設置可讓你在基於不一樣構建類型的 manifest 中修改版本名這個屬性,例如,若是須要在在 debug 版本中以」-SNAPSHOT」結尾,那麼就能夠輕鬆的看出當前是 debug 版仍是 release 版。
buildTypes { release { versionNameSuffix "sample" } }
-nodpi 在沒有特別定義的狀況下,不少修飾符(-mdpi,-hdpi,-xdpi等等)都會默認自動縮放 assets/dimensions,有時候咱們須要保持顯示一致,這種狀況下就可使用 -nodpi。
Activity.recreate () 強制讓 Activity 重建
BroadcastRecevier.setDebugUnregister ()什麼用不知道,調試用的。
android:weightSum (LinearLayout)這個頗有用,在百分比佈局沒有出來前,基本上就是經過這個屬性以及layout_weight屬性來間接達到百分比。
android:duplicateParentState (View) 此方法可使得子 View 能夠複製父 View 的狀態。好比若是一個 ViewGroup 是可點擊的,那麼能夠用這個方法在它被點擊的時候讓它的子 View 都改變狀態。
android:tileMode (BitmapDrawable)能夠指定圖片使用重複填充的模式。
android:enterFadeDuration/android:exitFadeDuration (Drawables)此屬性在 Drawable 具備多種狀態的時候,能夠定義它展現前的淡入淡出效果。
android:scaleType (ImageView)定義在 ImageView 中怎麼縮放/剪裁圖片,通常用的比較多的是centerCrop和centerInside。
Merge此標籤能夠在另外一個佈局文件中包含別的佈局文件,而不用再新建一個 ViewGroup,對於自定義 ViewGroup 的時候也須要用到;能夠經過載入一個帶有標籤的佈局文件來自動定義它的子部件。
AtomicFile經過使用備份文件進行文件的原子化操做的類
ViewDragHelper視圖拖動是一個比較複雜的問題。這個類能夠幫助解決很多問題。能夠參考這篇文章Android ViewDragHelper徹底解析 自定義ViewGroup神器
**PopupWindow**Android處處都在使用PopupWindow ,甚至你都沒有意識到(標題導航條ActionBar,自動補全AutoComplete,編輯框錯誤提醒Edittext Errors)。這個類是建立浮層內容的主要方法。
**SparseArray**Map的高效優化版本。推薦瞭解姐妹類SparseBooleanArray、SparseIntArray和SparseLongArray。在編寫通用適配器的時候SparseArray可能會用到
PackageManager.setComponentEnabledSetting()能夠用來啓動或者禁用程序清單中的組件。對於關閉不須要的功能組件是很是讚的,好比關掉一個當前不用的廣播接收器。
SQLitedatabase.yieldIfContendedSafely()讓你暫時中止一個數據庫事務, 這樣你能夠就不會佔用太多的系統資源。
Environment.getExternalStoragePublicDirectory()仍是那句話,用戶指望在SD卡上獲得統一的用戶體驗。用這個方法能夠得到在用戶設備上放置指定類型文件(音樂、圖片等)的正確目錄。
Context.getExternalFilesDir()申請了SD卡寫權限後,你能夠在SD的任何地方寫數據,把你的數據寫在設計好的合適位置會更加有禮貌。這樣數據能夠及時被清理,也會有更好的用戶體驗。此外,Android 4.0 Kitkat中在這個文件夾下寫數據是不須要權限的,每一個用戶有本身的獨立的數據存儲路徑。該API從V8纔開始支持。
View.generateViewId()每次我都想要推薦動態生成控件的ID。須要注意的是,不要和已經存在的控件ID或者其餘已經生成的控件ID重複。
ActivityManager.clearApplicationUserData() 一鍵清理你的app產生的用戶數據,多是作用戶退出登陸功能,有史以來最簡單的方式了。之前本身的作法真是不忍直視啊。
ActivityOptions方便的定義兩個Activity切換的動畫。 使用ActivityOptionsCompat 能夠很好解決舊版本的兼容問題。使用ActivityOptionsCompat 類能夠很方便的實現Material Design的切換動畫
ViewParent.requestDisallowInterceptTouchEvent() Android系統觸摸事件機制大多時候可以默認處理,不過有時候你須要使用這個方法來剝奪父級控件的控制權。
Fragment 的 setUserVisibleHint方法,可實現 fragment 對用戶可見時才加載資源(延遲加載)
IntentService一個能夠幹完活後本身去死且不須要咱們去管理子線程的Service
Executors. newSingleThreadExecutor()單線程順序執行的任務隊列
**android:animateLayoutChanges=」true」**LinearLayout中添加View的動畫的辦法,支持經過setLayoutTransition()自定義動畫
GradientDrawable漸變,可實現陰影效果
PointF,graphics包中的一個類,咱們常常見到在處理Touch事件的時候分別定義一個downX,一個downY用來存儲一個座標,若是座標少還好,若是要記錄的座標過多那代碼就很差看了。用PointF(float x, float y);來描述一個座標點會清楚不少。
StateListDrawable,定義Selector一般的辦法都是xml文件,可是有的時候咱們的圖片資源多是從服務器動態獲取的,好比不少app所謂的皮膚,這種時候就只能通StateListDrawable來完成了,各類addState便可。
includeFontPadding=」false」,TextView默認上下是有必定的padding的,有時候咱們可能不須要上下這部分留白,加上它便可。
onTrimMemory,在Activity中重寫此方法,會在內存緊張的時候回調(支持多個級別),便於咱們主動的進行資源釋放,避免OOM。
Fragment在onAttach方法中接收回調
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mPageSelectedListener = (PageSelectedListener) activity;
mMenuBtnOnclickListener = (MenuBtnOnClickListener) activity;
mCommitBtnOnClickListener = (CommitBtnOnClickListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + "must implements listener");
}
}
經過 WindowManager.addView 在其餘app界面添加一個view時,常常會沒法顯示,特別在miui,emui固件上,須要指定type爲LayoutParams.TYPE_TOAST。
Paint.setXfermode(porterDuffXfermode),在ApiDemo裏面有專門的介紹,實現了穿透,疊加,覆蓋等多種繪製效果,很是實用。在自定義View中用的比較多。
經過View.getDrawingCache()能夠獲取截圖,可是須要setDrawingCacheEnabled(true)頻繁使用可能會oom,還有一種方法直接用canvas
Bitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bm);
View.draw(canvas);
return bm;
因爲fragment的緩存機制決定的。默認狀況下,viewpager切換頁面時會緩存上一個頁面,非相鄰頁面被銷燬,可使用viewPaper.setOffscreenPageLimit()函數來解決
fragment嵌套時,內部fragment的manager經過getChildFragmentManager()得到
佈局中,view.bringTofont(),把該view在層疊佈局中置於最前面。通樣的viewgroup的bringChildtoFont(),都是同樣的效果。