如何从 ThemedReactContext 获取支持的片段管理器?
How to get the support fragment manager from ThemedReactContext?
环境
环境:
OS: macOS High Sierra 10.13.4
节点:8.11.3
纱线:未找到
npm:5.6.0
守望者:4.9.0
Xcode: Xcode 9.2 构建版本 9C40b
Android工作室:3.1 AI-173.4907809
软件包:(需要 => 已安装)
反应:^16.4.2 => 16.4.2
本机反应:0.55.4 => 0.55.4
描述
我正在编写一个自定义本机 android 库,它公开了一个支持片段以供显示。我在 React 的 android 侧创建了一个简单的视图管理器,其中我在 createViewInstance
中 return 占位符布局(只是父线性布局内的框架布局,稍后用片段布局替换) ] 然后打算在 receiveCommand
内添加库片段以响应来自反应端的用户操作。但是,为了将片段添加到容器中,我无法从 createViewInstance
中捕获的 ThemedReactContext
obj 获得支持片段管理器。执行 themedReactContextObj.getCurrentActivity()
会产生已弃用的 android.app.FragmentManager
。如何在我的视图管理器中获取 android.support.v4.app.FragmentManager
?感谢您的帮助。
这是我正在使用的代码,基于 SO 和博客上关于获取本机片段显示的一些解决方案。如果我使用 android.app.Fragment
而不是 android.support.v4.app.Fragment
:
来显示,它会起作用
package com.awesome.awesomelib
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.awesome.awesomelib.AwesomeFragment;
import java.util.Map;
public class AwesomeViewManager extends SimpleViewManager<View> {
public static final String REACT_CLASS = "RCTAwesomeView";
public static final int REACT_COMMAND_CREATE = 1;
private ThemedReactContext mContext = null;
@Override
public String getName() {
return REACT_CLASS;
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
mContext = reactContext;
LinearLayout layout = (LinearLayout) LayoutInflater.from(reactContext).inflate(R.layout.ll_awesomeview_container, null);
return layout;
}
@Nullable
@Override
public Map<String, Integer> getCommandsMap() {
return MapBuilder.of("create", REACT_COMMAND_CREATE);
}
@Override
public void receiveCommand(View view, int commandId, @Nullable ReadableArray args) {
Log.d(REACT_CLASS, "receiveCommand: " + commandId);
switch (commandId) {
case REACT_COMMAND_CREATE:
createFragment(view);
break;
}
}
private void createFragment(View view) {
if(mContext != null) {
// load the awesome lib fragment as container
AwesomeFragment awFragment = new AwesomeFragment();
//Here's where I'm stuck !!
mContext.getCurrentActivity().getFragmentManager().beginTransaction().add(R.id.fl_awesomeview_container, awFragment).commit();
}
}
}
由于 getFragmentManager() 已弃用,我如何从 ThemedReactContext 获取支持的片段管理器?
对于遇到此问题的任何其他人来说,目前是不可能的,因为 ReactActivity
不扩展 AppCompatActivity
,它在内部扩展了 FragmentActivity,后者将提供对支持片段管理器的访问。在 React 的 github 页面上打开了一个拉取请求,该页面解决了这个问题,但发布的时间表已经在眼前。
环境
环境: OS: macOS High Sierra 10.13.4 节点:8.11.3 纱线:未找到 npm:5.6.0 守望者:4.9.0 Xcode: Xcode 9.2 构建版本 9C40b Android工作室:3.1 AI-173.4907809
软件包:(需要 => 已安装) 反应:^16.4.2 => 16.4.2 本机反应:0.55.4 => 0.55.4
描述
我正在编写一个自定义本机 android 库,它公开了一个支持片段以供显示。我在 React 的 android 侧创建了一个简单的视图管理器,其中我在 createViewInstance
中 return 占位符布局(只是父线性布局内的框架布局,稍后用片段布局替换) ] 然后打算在 receiveCommand
内添加库片段以响应来自反应端的用户操作。但是,为了将片段添加到容器中,我无法从 createViewInstance
中捕获的 ThemedReactContext
obj 获得支持片段管理器。执行 themedReactContextObj.getCurrentActivity()
会产生已弃用的 android.app.FragmentManager
。如何在我的视图管理器中获取 android.support.v4.app.FragmentManager
?感谢您的帮助。
这是我正在使用的代码,基于 SO 和博客上关于获取本机片段显示的一些解决方案。如果我使用 android.app.Fragment
而不是 android.support.v4.app.Fragment
:
package com.awesome.awesomelib
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.awesome.awesomelib.AwesomeFragment;
import java.util.Map;
public class AwesomeViewManager extends SimpleViewManager<View> {
public static final String REACT_CLASS = "RCTAwesomeView";
public static final int REACT_COMMAND_CREATE = 1;
private ThemedReactContext mContext = null;
@Override
public String getName() {
return REACT_CLASS;
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
mContext = reactContext;
LinearLayout layout = (LinearLayout) LayoutInflater.from(reactContext).inflate(R.layout.ll_awesomeview_container, null);
return layout;
}
@Nullable
@Override
public Map<String, Integer> getCommandsMap() {
return MapBuilder.of("create", REACT_COMMAND_CREATE);
}
@Override
public void receiveCommand(View view, int commandId, @Nullable ReadableArray args) {
Log.d(REACT_CLASS, "receiveCommand: " + commandId);
switch (commandId) {
case REACT_COMMAND_CREATE:
createFragment(view);
break;
}
}
private void createFragment(View view) {
if(mContext != null) {
// load the awesome lib fragment as container
AwesomeFragment awFragment = new AwesomeFragment();
//Here's where I'm stuck !!
mContext.getCurrentActivity().getFragmentManager().beginTransaction().add(R.id.fl_awesomeview_container, awFragment).commit();
}
}
}
由于 getFragmentManager() 已弃用,我如何从 ThemedReactContext 获取支持的片段管理器?
对于遇到此问题的任何其他人来说,目前是不可能的,因为 ReactActivity
不扩展 AppCompatActivity
,它在内部扩展了 FragmentActivity,后者将提供对支持片段管理器的访问。在 React 的 github 页面上打开了一个拉取请求,该页面解决了这个问题,但发布的时间表已经在眼前。