Android 開發(fā)偷懶技巧之工具代碼片

  1. Iconfont在Android中的使用
    阿里提供的Iconfont-國內(nèi)功能很強(qiáng)大且圖標(biāo)內(nèi)容很豐富的矢量圖標(biāo)庫,提供矢量圖標(biāo)下載刁俭、在線存儲(chǔ)、格式轉(zhuǎn)換等功能。
    如何使用:

    • 從iconfont平臺(tái)選擇要使用到的圖標(biāo)
    • 下載代碼,把iconfont.ttf文件導(dǎo)入到項(xiàng)目中的assets中的iconfont文件夾中
    • 用TextView代替ImageView,找到圖標(biāo)相對(duì)應(yīng)的 HTML 實(shí)體字符碼給textView設(shè)置
    • textview設(shè)置大小跟顏色沮焕,圖標(biāo)的大小顏色也會(huì)改變
    • 為Textview設(shè)置指定的ttf文字
    <TextView
        android:id="@+id/icon_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="&#xe66e"
        android:textColor="@color/red"
        android:textSize="50dp"/>
    
    //為TextView設(shè)置指定ttf文字
    Typeface iconfont = Typeface.createFromAsset(getAssets(), "iconfont/iconfont.ttf");
    TextView textview = (TextView)findViewById(R.id.icon_text);
    textview.setTypeface(iconfont);
    

    上述方法可以使用iconfont了,但是每次都給TextView設(shè)置指定setTypeface是不是也很繁瑣,而且一直不斷的在讀取iconfont.ttf文字,也很浪費(fèi)內(nèi)存,所以就想到封裝一個(gè)工具類脸爱。代碼如下:

    public class FontHelper {
        public static final String DEF_FONT = "iconfont/iconfont.ttf";
    
        public static final void injectFont(View rootView) {
            injectFont(rootView, Typeface.createFromAsset(rootView.getContext().getAssets(),
                DEF_FONT));
        }
    
        private static void injectFont(View rootView, Typeface typeface) {
            if (rootView instanceof ViewGroup) {
                ViewGroup viewGroup = (ViewGroup) rootView;
                int childViewCount = viewGroup.getChildCount();
                for (int i = 0; i < childViewCount; i++) {
                    injectFont(viewGroup.getChildAt(i), typeface);
                }
            } else if (rootView instanceof TextView) {
                ((TextView) rootView).setTypeface(typeface);
            }
        }
    }
    

    這樣我們每次調(diào)用FontHelper.injectFont(textview)就可以了遇汞,你可能會(huì)說這還不是我想要的,我連這行代碼都不想多寫簿废,那好,接著往下看:我們可以自定義一個(gè)TextView然后初始化時(shí)setTypeface即刻络它,代碼如下:

    public class TextViewIcon extends AppCompatTextView {
        public TextViewIcon(Context context) {
            super(context);
            init(context);
        }
        public TextViewIcon(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
        public TextViewIcon(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
        }
        private void init(Context context) {
            setTypeface(Typeface.createFromAsset(context.getAssets(),"iconfont/iconfont.ttf"));
        }
    }
    

    現(xiàn)在我們?cè)诓季治募袑懭缦麓a即可:

    <com.xxx.xxx.TextViewIcon 
        android:id="@+id/icon_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="&#xe66e"
        android:textColor="@color/red"
        android:textSize="50dp"/>
    

    可是我也想實(shí)現(xiàn)像普通textview動(dòng)態(tài)改變文字一樣動(dòng)態(tài)改變iconfont的效果怎么辦呢族檬?也就是說在代碼里動(dòng)態(tài)的調(diào)整圖標(biāo)的大小顏色或改變圖片,iconfont改變大小顏色這很簡(jiǎn)單直接調(diào)用TextView的setTextSize和setTextColor就可以了化戳,動(dòng)態(tài)設(shè)置圖片是不是setText呢单料?
    textview.setText("");
    你會(huì)發(fā)現(xiàn)這并不會(huì)如你所愿顯示對(duì)應(yīng)的圖片效果,因?yàn)檫@里涉及到unicode 字符的問題点楼。所以將"&#x" 替換成 "\u"扫尖,用 unicode 字符來表示,即代碼如下:
    textview.settext("\ue66e");

  2. Scrollview 自動(dòng)滾動(dòng)到頂部或者底部

    • 設(shè)置默認(rèn)滾動(dòng)到頂部
      scrollView.post(new Runnable() {
      @Override
      public void run() {
      // TODO Auto-generated method stub
          scrollView.fullScroll(ScrollView.FOCUS_UP);
       }
      });
      
    • 設(shè)置默認(rèn)滾動(dòng)到底部
       scrollView.post(new Runnable() {
       @Override
       public void run() {
       // TODO Auto-generated method stub
             scrollView.fullScroll(ScrollView.FOCUS_DOWN);
       }
      });
      
  3. 判斷App的運(yùn)行狀態(tài)

     /**
      * 返回app運(yùn)行狀態(tài)
      * 1:程序在前臺(tái)運(yùn)行
      * 2:程序在后臺(tái)運(yùn)行
      * 3:程序未啟動(dòng)
      * 注意:需要配置權(quán)限<uses-permission android:name="android.permission.GET_TASKS" />
      */
     public static int getAppSatus(Context context, String pageName) {
    
         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
         List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(20);
    
         //判斷程序是否在棧頂
         if (list.get(0).topActivity.getPackageName().equals(pageName)) {
             return 1;
         } else {
             //判斷程序是否在棧里
             for (ActivityManager.RunningTaskInfo info : list) {
                 if (info.topActivity.getPackageName().equals(pageName)) {
                     return 2;
                 }
             }
             return 3;//棧里找不到掠廓,返回3
         }
     }
    
  4. 根據(jù)圖片寬度自適應(yīng)圖片控件的高度

      /*將ImageView 根據(jù)寬度自適應(yīng)高度(此處假設(shè)寬度>高度)*/
     public static void adaptiveHeightByWidth(ImageView view, int width){
         ViewGroup.LayoutParams lp = view.getLayoutParams();
         lp.width = width;
         lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
         view.setLayoutParams(lp);
         view.setMaxWidth(width);
         view.setMaxHeight(width);
     }
    
  5. Android 中如何調(diào)試webview

    • .在APP中啟用 WebView 調(diào)試换怖,開啟調(diào)試后,Chrome DevTools才能對(duì)WebView進(jìn)行遠(yuǎn)程調(diào)試蟀瞧;
      在對(duì)應(yīng)的android頁面中添加如下代碼:
      WebView.setWebContentsDebuggingEnabled(true);
    • 通過Chrome瀏覽器訪問chrome://inspect/#devices訪問已啟用調(diào)試的 WebView 列表沉颂;
    • 調(diào)試Webview與遠(yuǎn)程調(diào)試普通頁面相同,遠(yuǎn)程調(diào)試普通頁面也就是在安卓手機(jī)中安裝Chrome瀏覽器悦污,使用USB 連接 PC铸屉,然后在 PC 的 Chrome 瀏覽器中打開 chrome://inspect/#devices 即可。
    • 點(diǎn)擊inspect 進(jìn)入dev_tools 頁面可能碰到404 Not Found錯(cuò)誤切端,那是因?yàn)槟阍趪鴥?nèi)彻坛,F(xiàn)Q即可。
  6. Android按Home鍵避免重啟程序
    問題描述:
    在App打開后按Home鍵后應(yīng)用退至后臺(tái)運(yùn)行踏枣,此時(shí)點(diǎn)擊應(yīng)用圖標(biāo)再次打開App昌屉,發(fā)現(xiàn)App重新啟動(dòng),難道打開程序的頁面不應(yīng)該是在按Home鍵之前的頁面嗎椰于?
    解決方案:
    在啟動(dòng)頁也就是應(yīng)用程序剛進(jìn)入的Activity 即大部分都為閃屏頁怠益,在OnCreate方法中是在setContentView之前加入下面的代碼還是在setContentView之后加入一下代碼都可以。

     if (!this.isTaskRoot()) {
        Intent mainIntent = getIntent();
        String action = mainIntent.getAction();
        if (mainIntent.hasCategory(Intent.CATEGORY_LAUNCHER) 
            && action.equals(Intent.ACTION_MAIN)) {
                finish();
                return;
         }
     }
    
  7. Android中使用Glide獲取網(wǎng)絡(luò)圖片的寬高比

    public class ImageUtil {
     /**
      * 根據(jù)圖片鏈接獲取圖片寬高比
      * @param context
      * @param imgUrl
      * @return  高/寬
      */
     public static void getAspectRatioByImgUrl(Context context, String imgUrl, ImageAspectRatioCallBack aspectRatioCallBack){
         if (TextUtils.isEmpty(imgUrl)){
             return;
         }
         //獲取圖片真正的寬高
         Glide.with(context)
                 .load(imgUrl)
                 .asBitmap()//強(qiáng)制Glide返回一個(gè)Bitmap對(duì)象
                 .into(new SimpleTarget<Bitmap>() {
                     @Override
                     public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {
                         int width = bitmap.getWidth();
                         int height = bitmap.getHeight();
                         Log.e(Constant.LOG_TAG, "width " + width);
                         Log.e(Constant.LOG_TAG, "height " + height);
                         if (width > 0 && aspectRatioCallBack != null){
                             aspectRatioCallBack.returnAspectRation((float) height/width);
                         }
                     }
                 });
      }
    
      public interface ImageAspectRatioCallBack {
         void returnAspectRation(float aspectRatio);
      }
    }
    
  8. Android中webview嵌套H5頁面報(bào)錯(cuò)"Uncaught Error: Java exception was raised during method invocation"
    問題描述:
    客戶端提供給H5一個(gè)方法供其修改原生頁面標(biāo)題的頭部顯示信息瘾婿,代碼如下:

       @JavascriptInterface
       public void resetTitle(String title2) {
        mTitleTv.setText(title2);
       }
    

    結(jié)果H5在調(diào)用該方法時(shí)就會(huì)報(bào)此錯(cuò)誤蜻牢,原因是因?yàn)?strong>在@JavascriptInterface 注解的方法里面不能更新ui.
    解決方案:

       @JavascriptInterface
       public void resetTitle(String title2) {
        BrowserActivity.this.runOnUiThread(new Runnable() {
               @Override
                   public void run() {
                    mTitleTv.setText(title2);
                   }
               });
       }
    
  9. 查看android手機(jī)中安裝apk的包名等信息

  • 方法一:
    進(jìn)入cmd窗口烤咧,輸入adb shell,進(jìn)入手機(jī)抢呆,在輸入ls /data/data煮嫌,即能顯示出手機(jī)中安裝apk的包名。(需要root權(quán)限)
  • 方法二:
    查看手機(jī)中非系統(tǒng)的apk包名信息抱虐,adb shell pm list package -3昌阿,這個(gè)命令很實(shí)用。這和命令后面不加-3表示查看手機(jī)中使用的apk包名恳邀。
  • 方法三:
    在代碼中獲取Android設(shè)備中apk的包名等信息懦冰。
     /*獲取Android手機(jī)中安裝的應(yīng)用*/
      public static void getAllAppPackages(Context context) {
          Intent intent = new Intent(Intent.ACTION_MAIN, null);
          intent.addCategory(Intent.CATEGORY_LAUNCHER);
          List<ResolveInfo> apps = context.getPackageManager().queryIntentActivities(intent, 0);
          //for循環(huán)遍歷ResolveInfo對(duì)象獲取包名和類名
          for (int i = 0; i < apps.size(); i++) {
              ResolveInfo info = apps.get(i);
              String packageName = info.activityInfo.packageName;
              CharSequence cls = info.activityInfo.name;
              CharSequence name = info.activityInfo.loadLabel(context.getPackageManager());
              Log.e(Constant.LOG_TAG,name+"----"+packageName+"----"+cls);
          }
      }
    
  1. 解決使用HttpURLConnection讀取網(wǎng)絡(luò)文件亂碼問題
    public static void getRemoteMockApiData(final String mockdataUrl, final JsonCallBack jsonCallBack){
        final StringBuilder stringBuilder = new StringBuilder();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //構(gòu)建URL地址
                    URL url = new URL(mockdataUrl);
                    try {
                        HttpURLConnection hcont = (HttpURLConnection) url.openConnection();
                        hcont.setRequestProperty("Content-Type", "application/json");
                        hcont.setDoOutput(true);
                        hcont.setRequestMethod("GET");
                        hcont.setRequestProperty("Accept-Charset", "utf-8");
                        hcont.setRequestProperty("contentType", "utf-8");
    
                        if (hcont.getResponseCode() == 200) {
                            InputStreamReader in = null;
                            in = new InputStreamReader(hcont.getInputStream(),"utf-8");
                            BufferedReader bufferedReader = new BufferedReader(in);
                            String line = null;
                            while ((line = bufferedReader.readLine()) != null) {
                                stringBuilder.append(line);
                            }
                        }
    
                        if (jsonCallBack != null){
                            jsonCallBack.getRemoteMockData(stringBuilder.toString());
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    
  2. 基于android studio 3.1.4將library生成jar和arr文件
    其實(shí)Android Studio編譯的時(shí)候會(huì)自動(dòng)將library項(xiàng)目生成jar和aar的,分別在build/outputs/aarbuild/intermediates/packaged-classes文件夾下谣沸。
  • 在對(duì)應(yīng)的module文件下的build.gradle中添加以下代碼:
    task makeJar(type: Copy) {
    //刪除存在的
     delete 'build/libs/react-native-bridge.jar'
    //設(shè)置拷貝的文件
     from('build/intermediates/packaged-classes/release/')
    //打進(jìn)jar包后的文件目錄
     into('build/libs/')
    //將classes.jar放入build/libs/目錄下
     include('classes.jar')
     rename ('classes.jar','react-native-bridge.jar')
    }
    makeJar.dependsOn(build)
    
  • 選中l(wèi)ibrary的Module刷钢,點(diǎn)擊Build -> Make Module library,此時(shí)packaged-classes目錄即可生成乳附。
  • 在AS最下方的Terminal中輸入命令即可内地。
    1. MAC電腦:
      ./gradlew makeJar
    2. Windows電腦:
      gradlew makeJar
  • 順利的話就可以在build/libs文件夾下看到生成的jar文件。

ADB命令:

  • 獲取手機(jī)CPU型號(hào):
    adb shell getprop ro.product.cpu.abi
  • 獲取當(dāng)前棧頂Activity相關(guān)的信息:
    adb shell dumpsys activity top > info.txt
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赋除,一起剝皮案震驚了整個(gè)濱河市阱缓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌举农,老刑警劉巖荆针,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異并蝗,居然都是意外死亡祭犯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門滚停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沃粗,“玉大人,你說我怎么就攤上這事键畴∽钪眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵起惕,是天一觀的道長涡贱。 經(jīng)常有香客問我,道長惹想,這世上最難降的妖魔是什么问词? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嘀粱,結(jié)果婚禮上激挪,老公的妹妹穿的比我還像新娘辰狡。我一直安慰自己,他們只是感情好垄分,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布宛篇。 她就那樣靜靜地躺著,像睡著了一般薄湿。 火紅的嫁衣襯著肌膚如雪叫倍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天吆倦,我揣著相機(jī)與錄音,去河邊找鬼炉奴。 笑死逼庞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞻赶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼派任,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼砸逊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掌逛,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤师逸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后豆混,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篓像,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年皿伺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了员辩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸵鸥,死狀恐怖奠滑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒穴,我是刑警寧澤宋税,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站讼油,受9級(jí)特大地震影響杰赛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矮台,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一乏屯、第九天 我趴在偏房一處隱蔽的房頂上張望根时。 院中可真熱鬧,春花似錦瓶珊、人聲如沸啸箫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忘苛。三九已至,卻和暖如春唱较,著一層夾襖步出監(jiān)牢的瞬間扎唾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工南缓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胸遇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓汉形,卻偏偏與公主長得像纸镊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子概疆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容