1.react native 調用原生必須繼承一個SimpleViewManager
1.但是SimpleViewManager 需要View的子類才能繼承 而我們activity最終繼承的是Context,接下來我就需要擷取activity的view
2.首先在外部擷取activity的View 衆所周知我們要擷取某個class 有兩種方法一個是直接new,一個是通過反射擷取。但是這兩者都行不通的
3.檢視android系統底層源碼你會發現LocalActivityManger通過startActivity(String id,Intent intent),可以與指定的activity綁定,并且傳回一個 window,LocalActivityManager 可以同時管理多個activity
4.首先我們拿到LocalActivityManger對象,然後再從擷取DecorView
補充下DecorView是整個ViewTree的最頂層View,它是一個FrameLayout布局,代表了整個應用的界面。在該布局下面,有标題view和内容view這兩個子 元素(不懂得可以看底層View源碼解讀)
mActivityManager = new LocalActivityManager(this, true);
mActivityManager .dispatchCreate(savedInstanceState);
View view = mActivityManager.startActivity("", new Intent(this, TrendTwoActivity.class)).getDecorView();
5.上面的這樣就結束了,想多了這樣還是會報錯的
6.擷取activity的view必須要到activity onPause和onResume 進行配置兩個方法
mActivityManager.dispatchPause(isFinishing());和mActivityManager.dispatchResume();
這樣就可以拿到了activity中的view
有人會問了SimpleViewManager沒有onPause和onResume兩個生命周期方法,對确實沒有,
了解react native的啟動機制的就知道react native 啟動都是依賴原生的activity來啟動的,我們可以到 MainActivity中去拿到View再進行存儲,根據原生UI元件再擷取進行傳回,(原生ui元件的不會去看react native官網或者搜尋網上,有很多資料)
ok完美解決,現在我們貼出源碼給大家參考下
public class MainActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
return "xxx";
}
LocalActivityManager mActivityManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//擷取走勢的view
if( MainApplication.trendView==null) {
mActivityManager = new LocalActivityManager(this, true);
mActivityManager.dispatchCreate(savedInstanceState);
View view = mActivityManager.startActivity("", new Intent(this, TrendTwoActivity.class)).getDecorView();
MainApplication.trendView = view;
}
}
@Override
protected void onPause() {
super.onPause();
mActivityManager.dispatchPause(isFinishing());
}
@Override
protected void onResume() {
super.onResume();
mActivityManager.dispatchResume();
}
/**
* Created by kim
* on 2017/10/24 0024.
*/
public class TrendView extends SimpleViewManager<View> {
@Override
public void onCatalystInstanceDestroy() {
super.onCatalystInstanceDestroy();
}
@Override
public String getName() {
return "TrendView";
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
Log.d("view___",MainApplication.trendView+"");
return MainApplication.trendView;
}
}