git*_*ble 19 android react-native
这个问题比它看起来更难回答.
ReactFragmentActivity确实存在于React Native的主分支中,但是
创建React片段有一个未解决的问题,请参阅https://github.com/facebook/react-native/pull/12199/commits/e5b68717f57c41f5f1e77c289bdb4f673bb242f1 //这尚未获得批准,但需要得到承认.
我在github等上查看过几十个React Native示例,并且片段从未显示过.证明我错了!
显然并非不可能看到:片段中的React-native,但这个解决方案似乎并不能完全处理触摸事件.
我的印象是React Native主要关注控制布局的整个活动的根视图.我认为在拍摄片段时会有一些谨慎使用.作为旁注,React本身(不是React Native)似乎有自己的片段概念.我甚至猜测React Native灵活的瑜伽布局管理器,因为它不想处理Android碎片.新应用程序不是一个问题,但是将React Native集成到现有应用程序中这是真正的问题!
如果你不知道但是想知道请你们投票!
我不知道,也许您已经找到了解决方案,但这对其他人可能有帮助。您提供的解决方案确实在使用本机 androidFragmentActivity或AppCompatActivity. 但是react-native有自己的ReactFragmentActivity,如果你的活动扩展了这个活动,触摸事件可以很好地工作,但只能在单独的片段中。它不适用于 ViewPager 等。仅当片段在单独的 Activity 中使用时,如下所示:
Fragment reactFragment = new MainReactFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment, reactFragment, "reactFragment").commit();
Run Code Online (Sandbox Code Playgroud)
编辑:
经过一些试验和错误,我让它正确地与 ViewPager 和 TabLayout 一起工作(但我认为在其他情况下它也能工作)。所以,这就是我所做的。ReactFragment 看起来像这样:
public abstract class ReactFragment extends Fragment {
private ReactRootView mReactRootView;
private ReactInstanceManager mReactInstanceManager;
// This method returns the name of our top-level component to show
public abstract String getMainComponentName();
@Override
public void onAttach(Context context) {
super.onAttach(context);
mReactRootView = new ReactRootView(context);
}
public void setmReactInstanceManager(ReactInstanceManager mReactInstanceManager){
this.mReactInstanceManager = mReactInstanceManager;
}
@Override
public ReactRootView onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
return mReactRootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mReactRootView.startReactApplication(
mReactInstanceManager,
getMainComponentName(),
null
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后实现我们的片段:
public class MainReactFragment extends ReactFragment {
@Override
public String getMainComponentName() {
return "reactProject";
}
}
Run Code Online (Sandbox Code Playgroud)
我们需要从 ReactFragmentActivity 扩展我们的 Activity 并初始化 ReactInstanceManager:
public class MainActivity extends ReactFragmentActivity {
TabLayout tabs;
ViewPager viewPager;
private ReactInstanceManager mReactInstanceManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
tabs = (TabLayout) findViewById(R.id.menuItemTabs);
viewPager = (ViewPager) findViewById(R.id.tabMainMenu);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
TabsAdapter adapter = new TabsAdapter(getSupportFragmentManager(), mReactInstanceManager);
viewPager.setAdapter(adapter);
tabs.setupWithViewPager(viewPager);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
mReactInstanceManager.showDevOptionsDialog();
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public void invokeDefaultOnBackPressed() {
super.onBackPressed();
}
@Override
public void onPause() {
super.onPause();
if (mReactInstanceManager != null) {
mReactInstanceManager.onHostPause(this);
}
}
@Override
public void onResume() {
super.onResume();
if (mReactInstanceManager != null) {
mReactInstanceManager.onHostResume(this, this);
}
}
@Override
public void onBackPressed() {
if (mReactInstanceManager != null) {
mReactInstanceManager.onBackPressed();
}
else {
super.onBackPressed();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,还有 TabAdapter:
public class TabsAdapter extends FragmentStatePagerAdapter {
ReactInstanceManager mReactInstanceManager;
public TabsAdapter(FragmentManager fragmentManager, `enter code here`ReactInstanceManager reactInstanceManager){
super(fragmentManager);
mReactInstanceManager = reactInstanceManager;
}
@Override
public Fragment getItem(int position) {
MainReactFragment reactFragment = new MainReactFragment();
reactFragment.setmReactInstanceManager(mReactInstanceManager);
return reactFragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public int getItemPosition(Object item) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return "react tab " + position;
}
@Override
public Parcelable saveState() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
| 归档时间: |
|
| 查看次数: |
2018 次 |
| 最近记录: |