Android 蹲坑的疑難雜症集錦一

戀貓de小郭發表於2016-11-20

 各位看官老爺子你們好,我就是那個挖坑不埋,還喜歡開新礦的小喵同志。

 問大家一個問題,在Github上找專案的時候,看到中文簡介說明你們是不是覺得這個專案很low不屑一顧?

 最近朋友無意中說,在Github上看到中文的專案點都不想點進去,太low了。想想好像很多大神的專案都是純英語的,so,作為只有四級程度的小同志,我就是那個專案裡瀰漫著中文的傢伙(ノQ益Q)ノ彡┻━┻,你們怎麼看?我挺喜歡中文的。
 
例牌Github:github.com/CarGuo :歡迎各種姿勢的star,fuck,watch。

 這期要聊的是那麼躺在坑裡的需求,想想這一路走來,本人還能正常的行走於人世,真是好感動呢,感謝產品和QA的不殺之恩。

  • 1、TextView的由於Span導致省略號顯示不正常問題。

  • 2、TextView容易被背景同化看不清?增加陰影吧。

  • 3、啟動白屏一會或者點選logo卡頓很久沒反應的暴力解決。

  • 4、開啟自定義相簿,選擇圖片容易OOM,頁面崩潰回到程式crash。

  • 5、ViewPager巢狀RecyclerView還有輪播圖的手勢衝突,參考:linkagescroll

  • 6、透明主題會導致手機背景在切換Tab的時候穿透到桌面,一般MainActivity不要用這個。

  • 7、ViewPager的實時資料重新整理。

  • 8、CardView 慎用,因為在某些低版本的機器上會有白帶,需要的話可以用shape實現圓角。

  • 9、圖片壓縮安利。

  • 10、RecyclerView的回到頂部的優化。

1、之前分享過一篇文章《文字編輯和顯示(emoji表情,@某人、連結高亮點選)》,這裡用到的Spanable替代String用於TextView的顯示,一般情況下是沒什麼問題的,但是如果你需要在列表中或者詳情中做省略號處理,你就有可能發現,省略號居然出現在表情的前面,把一大段文字給省略了;又或者直接最後面顯示了一部分的表情。原因Google可閱,這裡就說說我農村式的做法吧:

 是的,自己截斷,根據你需要的行數,對應的在顯示的時候把資料截斷,然後自己加上···(這裡如有更好的記得評論分享啊!)

textView.setText(spannable);
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        if (textView.getLineCount() > lineCount) {
            int endOfLastLine = textView.getLayout().getLineEnd(lineCount - 1);
            if (endOfLastLine > 4) {
                CharSequence newVal = textView.getText().subSequence(0, endOfLastLine - 4);
                textView.setText(newVal);
                textView.append("...");
            }
        }
    }
});複製程式碼

2、TextView經常會因為背景圖片的原因而導致出現看不清文字的情況,這裡無數次考慮之後,決定某些特殊地方可以用輕微的陰影解決。

android:shadowColor="#AA000000"
android:shadowDy="1"
android:shadowRadius="1"複製程式碼

3、啟動頁問題,其實最好是做冷啟動優化,但是作為一個時間緊(tou)張(lan)的程式猿,我是在WelcomeActivity的主題裡設定了主題,暴力解決,雖然這不是長久之計:


複製程式碼

4、開啟自定義相簿OOM主要要解決的還是記憶體釋放的問題,有時候記憶體一下子來的太猛還是不行的,而且邏輯有問題的崩潰導致APP直接回到解放前的確得不償失,所以呢:

 直接把選擇Activityyoga新的process程式開啟,這樣閃退了也不影響APP啊,資料該怎麼返回還是怎麼返回。什麼?首次啟動的時候回卡白屏幾秒,下面的主題暴力幫助你。什麼?開啟卡頓一會才能看到頁面。我試了微信也會,所以如果有優化的控制元件記得評論分享下,這樣我可以愉悅的去找產品說(zhuang)教(B)。


···
複製程式碼

 
5、更新ViewPager,這裡簡單上程式碼,感受下,我就靜靜的不說話.....((/- -)/:

 resolveViewLogic();//比如更新list資料
 fragmentPagerAdapter.setUpdateFlag(true);//讓其更新
 fragmentPagerAdapter.notifyDataSetChanged();
 fragmentPagerAdapter.setUpdateFlag(false);//關了

···
public class RefreshFragmentPagerAdapter extends FragmentPagerAdapter {

    private List fragments;
    private FragmentManager fragmentManager;
    private boolean updateFlag;


    public boolean isUpdateFlag() {
        return updateFlag;
    }

    public void setUpdateFlag(boolean updateFlag) {
        this.updateFlag = updateFlag;
    }

    public void setFragments( List fragments) {
        this.fragments = fragments;
    }


    public RefreshFragmentPagerAdapter(FragmentManager fragmentManager, List fragments) {
        super(fragmentManager);
        this.fragments = fragments;
        this.fragmentManager = fragmentManager;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "";
    }

    //讓其更新
    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    //核心方法
    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        if (updateFlag) {//根據需求新增更新標示
            //得到快取的fragment
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            //得到tag,這點很重要
            String fragmentTag = fragment.getTag(); //這裡的tag是系統自己生產的,我們直接取就可以
            //如果這個fragment需要更新
            FragmentTransaction ft = fragmentManager.beginTransaction();
            //移除舊的fragment
            ft.remove(fragment);
            //換成新的fragment
            fragment = fragments.get(position);
            //新增新fragment時必須用前面獲得的tag,這點很重要
            if (!fragment.isAdded()) {
                ft.add(container.getId(), fragment, fragmentTag);
                ft.attach(fragment);
                ft.commit();
            }
            return fragment;
        } else {
            return super.instantiateItem(container, position);
        }
    }
}複製程式碼

9、圖片壓縮安利:Luban,壓縮效果真的不錯,和微信一拼,就是那種長的離譜的圖片壓縮後效果不佳,其他都很不錯,反正我是直接把裡面的thirdCompress拿出來套到自己裡面。

private File thirdCompress(@NonNull File file)複製程式碼

10、RecyclerView的回到頂部的優化。

 也許你會問,不就是一鍵回去麼,為什麼還要優化?
 
 因為愛情,不會輕易悲傷,產品經理都是年輕的模樣,看看回到頂部的效果,所以就有了這個優化:

 記得先停止滾動,然後回到第十個,然後在智慧的滾到頂部,不信你試試,感覺舒服好多喲。

protected void goToTop() {
    mRecyclerView.stopScroll();
    mLayoutManager.setSmoothScrollbarEnabled(true);
    if (firstVisibilityPosition > 10) {
        mLayoutManager.scrollToPositionWithOffset(10, 0);
    }
    mRecyclerView.smoothScrollToPosition(0);
    firstVisibilityPosition = 0;
}複製程式碼

Android 蹲坑的疑難雜症集錦一
聽說你要給吃的

相關文章