React Native Android之原生UI組件動態(tài)addView不顯示問題解決

React Native Android之原生UI組件動態(tài)addView不顯示問題解決

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載寿烟。

轉(zhuǎn)載請表明出處:http://www.reibang.com/p/a6c5042c5ce8

[TOC]

在如今的App中箱蟆,已經(jīng)有成千上萬的原生UI部件了——其中的一些是平臺的一部分瑰排,另一些可能來自于一些第三方庫挖炬,而且可能你自己還收藏了很多。React Native已經(jīng)封裝了大部分最常見的組件鼠渺,譬如ScrollViewTextInput,但不可能封裝全部組件眷细。而且拦盹,說不定你曾經(jīng)為自己以前的App還封裝過一些組件,React Native肯定沒法包含它們溪椎。幸運的是掌敬,在React Naitve應用程序中封裝和植入已有的組件非常簡單。但在實施的過程中往往會發(fā)生一些小狀況池磁,如今天分享的這個問題奔害,當原生UI組件動態(tài)addView時在界面中不顯示。
(下面React Native 簡稱為RN)

還原場景

在下面代碼中地熄,我們定義了一個原生的控件华临,這個組件同樣也可用于RN。

public class RCTVideoLayout extends RelativeLayout {

    public RCTVideoLayout(Context context) {
        this(context, null);
    }

    public RCTVideoLayout(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RCTVideoLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    /**
     * 初始化View
     *
     * @param context
     */
    private void initView(Context context) {
        View rootView = View.inflate(context, R.layout.video_layout, null);
        addView(rootView);
    }

    /**
     * 動態(tài)添加View
     * @param str
     */
    public void autoAddView(String str){
        Button button = new Button(getContext());
        button.setText(str);
        addView(button);
    }

在這段上面的autoAddView函數(shù)中就是一個動態(tài)添加View的操作端考,如果這段代碼在原生中執(zhí)行是沒問題的雅潭,但在RN中動態(tài)調(diào)用,會導致無論addView多少次都沒問題却特,但在RN中每次調(diào)用均在UI中看不出有什么明顯變化扶供,通過斷點也是沒發(fā)現(xiàn)問題所在,那么究竟是什么原因?qū)е碌哪亓衙鳎旅嫖医o大家分析一下椿浓。

利用工具分析問題所在

發(fā)生如此詭異的情況,該怎么分析呢闽晦?Android Studio中有個工具Layout inspector扳碍,這個工具可以快速對手機上面的界面做分析。

  • Android Studio打開任意工程后仙蛉,按照如下圖所示:
    WechatIMG11
  • 等待幾秒后笋敞,會自動打開分析界面:
屏幕快照 2017-09-06 上午11.06.47.png
  • 這個界面是一個Demo工程,里面同樣也是用RN調(diào)用原生封裝的組件荠瘪,但同樣的情況是調(diào)用了原生addView后夯巷,并沒有在UI上看到

  • 現(xiàn)在把所有的層級打開后赛惩,發(fā)現(xiàn)原生的確已經(jīng)addView進去了,只不過他的height和 width 都是0趁餐,所以這樣就能解釋為什么我們動態(tài)添加View后看不到UI變化喷兼。

    WechatIMG8

解決方案

  • 從上圖中可以分析得到,無論我們addView多少次澎怒,所產(chǎn)生的View都是0高0寬褒搔,這個明顯就是沒有讓ViewGroup去測量子控件。現(xiàn)在原因已經(jīng)明了喷面,那么如何解決這種問題呢星瘾?那當然是讓ViewGroup每次都自己測量子控件的高寬咯皮假,我們回到剛才的自定義ViewGroup中的代碼中怜械,添加如下代碼:

    //以下代碼修復通過動態(tài) addView 后看不到的問題
    
    @Override
    public void requestLayout() {
        super.requestLayout();
        post(measureAndLayout);
    }
    
    private final Runnable measureAndLayout = new Runnable() {
        @Override
        public void run() {
            measure(
                    MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
            layout(getLeft(), getTop(), getRight(), getBottom());
        }
    };
    
  • 以上代碼中所作的事情就是每次addView后图毕,在ViewGroup源碼中可看到addView后茫死,實際調(diào)用requestLayout()函數(shù),如下圖所示:

屏幕快照 2017-09-06 上午11.21.06.png
  • 添加代碼后阿宅,我們再次運行程序碾局,再次通過Layout inspector工具來看看效果:

    WechatIMG9
  • 可以發(fā)現(xiàn)這回終于有顯示了碗脊,再看到hight和width都有對應的值了边翁。

總結(jié)

以上是我在封裝原生控件給RN調(diào)用時遇到的一個問題翎承,歡迎大家支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末符匾,一起剝皮案震驚了整個濱河市叨咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啊胶,老刑警劉巖甸各,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焰坪,居然都是意外死亡趣倾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門某饰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儒恋,“玉大人,你說我怎么就攤上這事露乏”套牵” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵瘟仿,是天一觀的道長。 經(jīng)常有香客問我比勉,道長劳较,這世上最難降的妖魔是什么驹止? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮观蜗,結(jié)果婚禮上臊恋,老公的妹妹穿的比我還像新娘。我一直安慰自己墓捻,他們只是感情好抖仅,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砖第,像睡著了一般撤卢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梧兼,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天放吩,我揣著相機與錄音,去河邊找鬼羽杰。 笑死渡紫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的考赛。 我是一名探鬼主播惕澎,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颜骤!你這毒婦竟也來了唧喉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤复哆,失蹤者是張志新(化名)和其女友劉穎欣喧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯找,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡唆阿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锈锤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驯鳖。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖久免,靈堂內(nèi)的尸體忽然破棺而出浅辙,到底是詐尸還是另有隱情,我是刑警寧澤阎姥,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布记舆,位于F島的核電站,受9級特大地震影響呼巴,放射性物質(zhì)發(fā)生泄漏泽腮。R本人自食惡果不足惜御蒲,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诊赊。 院中可真熱鬧厚满,春花似錦、人聲如沸碧磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲸郊。三九已至丰榴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間严望,已是汗流浹背多艇。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留像吻,地道東北人峻黍。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拨匆,于是被迫代替她去往敵國和親姆涩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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