gpt4 book ai didi

android - react native 添加 fragment 以查看未显示

转载 作者:行者123 更新时间:2023-12-02 11:08:07 25 4
gpt4 key购买 nike

我已将动态生成的 FrameLayout 添加到 react native View 中。框架布局正在显示。但是当我向 View 添加 fragment 时,什么也没有显示。

这是部分代码:

    public FrameLayout createViewInstance(ThemedReactContext context) {

Fragment fragment = MapFragment.newInstance(mapKey);
FrameLayout view = new FrameLayout(context);
view.setWillNotDraw(false);

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
view.setLayoutParams(lp);

view.setId(View.generateViewId());

view.setBackgroundColor(Color.parseColor("#1FFDDB"));

FragmentActivity activity = MainActivity.getFragmentActivity();

FragmentManager fragmentManager = activity.getSupportFragmentManager();

fragmentManager.beginTransaction().remove(fragment).commit();
fragmentManager.executePendingTransactions();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.add(0, fragment);

fragmentTransaction.show(fragment);
fragmentTransaction.attach(fragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
return view;
}

当我将 TextView 添加到它显示的 View 时:

// add a textfield to the view
TextView textView1 = new TextView(context);
textView1.setText("Android");
textView1.setTextSize(30);
textView1.setGravity(Gravity.CENTER);

view.setVisibility(View.VISIBLE);

view.addView(textView1);

因此 fragment 存在问题。任何想法为什么 fragment 没有显示?

最佳答案

我也遇到了这个问题,并找到了解决办法。

安卓端:首先,创建一个layout_container.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

然后在createViewInstance方法中对其进行膨胀,并定义函数以将 fragment 添加到容器中。

@Override
public String getName() {
return "ExampleFragment";
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
mContext = context;
LinearLayout root = (LinearLayout) LayoutInflater.from(reactContext)
.inflate(R.layout.layout_container, null);
return root;
}

@Nullable
@Override
public Map<String, Integer> getCommandsMap() {
return MapBuilder.of(
"create", COMMAND_CREATE
);

}

@Override
public void receiveCommand(View view, int commandId, @Nullable ReadableArray args) {
Log.d(TAG, "receiveCommand: " + commandId);
switch (commandId) {
case COMMAND_CREATE:
createFragment();
break;
}
}

private void createFragment() {
MapFragment mapFragment = new MapFragment();
mContext.getCurrentActivity()
.getFragmentManager()
.beginTransaction()
.add(R.id.container, mapFragment)
.commit();
}

RN方:创建 native UI 组件 Fragment.js

import {NativeModules, requireNativeComponent, View, UIManager, findNodeHandle} from 'react-native';
const fragmentIFace = {
name: "Fragment",
propTypes: {
...View.propTypes,
}
};
const NativeFragment = requireNativeComponent("ExampleFragment", fragmentIFace);
class ExampleFragment extends Component {
fragment;
render() {
return <NativeFragment
ref={c => this.fragment = c}
{...this.props} style={{flex: 1}}/>
}

create = () => {
UIManager.dispatchViewManagerCommand(
findNodeHandle(this.fragment),
UIManager.MapFragment.Commands.create,
[] // No args
)
}
export default ExampleFragment

然后就可以在RN中使用了。

class App extends Component {
componentDidMount() {
this.fragment.create();
}
render() {
return (
<View>
<ExampleFragment ref={r=>this.fragment = r} />
</View>
);
}
}

解释如下:
在您的代码中,您尝试将 fragment 添加到不能是 fragment 容器的 View 中。
通常,View.generateViewId() 会返回 id 0x1,它与 ReactRootView 巧合,这样您的应用就不会崩溃。如果您将其他 id 设置为容器 View ,您将收到异常并且应用程序将崩溃,因为无法从当前应用程序的布局中找到您的 View 的 id。
您可以使用 Android Studio 中的布局检查器进行检查。

为了防止重复的 ids,最好的方法是在 xml 中定义它们。这就是为什么我从 xml 膨胀 Root View 。
但如果你为根设置了 id(在我的示例中为LinearLayout),则在添加 RN 时该 id 会被 RN 删除,因此子级是必需的。
RN 获取 Root View (didComponentMount())后,您需要从 RN 组件中调用 create(),您就可以看到它了。

关于android - react native 添加 fragment 以查看未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com