react native 原生UI組件

原生UI組件的封裝方法與封裝原生模塊十分類似。

我們以 WebView 為例進(jìn)行封裝。

需要繼承 SimpleViewManager 這個(gè)泛型類,和原生模塊類似,需要重寫getName()方法,將UI組件名稱暴露給JavaScript層,接著需要重寫createViewInstance方法,在里面返回我們需要使用的原生UI組件的實(shí)例,這里就是WebView。然后就是暴露一些必要屬性給javascript層,為了簡(jiǎn)單起見,我們這里只暴露兩個(gè)屬性,一個(gè)是url,一個(gè)是html,一旦javascript層設(shè)置了url,就會(huì)加載一個(gè)網(wǎng)頁(yè),而一旦設(shè)置了html,則會(huì)去加載這段html,而屬性的暴露是使用注解,將注解設(shè)置在對(duì)應(yīng)的set方法上,之后再set方法中處理UI的更新,比如一旦設(shè)置了url,在setUrl里面就要加載網(wǎng)頁(yè)。最終我們的ViewManager就是這樣子的。

package com.reactnativeproject;

import android.support.annotation.Nullable;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;

/**
 * Created by createdit on 17/2/10.
 */
public class ReactWebViewManager extends SimpleViewManager<WebView> {

    public static final String REACT_CLASS = "RCTWebView";

    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Override
    protected WebView createViewInstance(ThemedReactContext reactContext) {
        WebView webView = new WebView(reactContext);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url){
                view.loadUrl(url);
                return true;
            }
        });

        return webView;
    }

    @ReactProp(name="url")
    public void setUrl(WebView view, @Nullable String url){
        Log.e("TAG","setUrl");
        view.loadUrl(url);
    }

    @ReactProp(name="html")
    public void setHtml(WebView view, @Nullable String html) {
        Log.e("TAG","setHtml");
        view.loadData(html, "text/html; charset=utf-8,", "UTF-8");
    }
}

和原生模塊一樣,原生UI組件也需要進(jìn)行注冊(cè),實(shí)現(xiàn)ReactPackage接口,進(jìn)行WebView的注冊(cè)。

package com.reactnativeproject;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Created by createdit on 17/2/10.
 */
public class AppReactPackage implements ReactPackage {

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Arrays.<ViewManager>asList(
                new ReactWebViewManager()
        );
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前面兩篇文章主要介紹了如何在ReactNative中集成并使用原生模塊的代碼,本篇文章會(huì)講解另一個(gè)和原生模塊有關(guān)的...
    zhuhf閱讀 4,729評(píng)論 3 11
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,176評(píng)論 25 708
  • 上一篇文章[React Native]原生UI組件(上)我們介紹了如何在ReactNative中使用原生UI組件,...
    zhuhf閱讀 4,170評(píng)論 12 4
  • 問(wèn)花不語(yǔ),花替人愁。 我是紫州一人之下萬(wàn)人之上的漫天公主,我的名喚紫漫天,我的國(guó)家是紫州最龐大的紫衿國(guó)??墒强v使我...
    未慈閱讀 1,990評(píng)論 3 18
  • 女兒是父母的貼心小棉襖,以至于我家重女輕男,從來(lái)都是弟弟去干活,我和妹妹休息中。今天看到果汁的留言,不自覺心都化了...
    臻靜閱讀 426評(píng)論 0 3

友情鏈接更多精彩內(nèi)容