【问题标题】:How to get the support fragment manager from ThemedReactContext?如何从 ThemedReactContext 获取支持片段管理器?
【发布时间】:2018-09-27 04:27:50
【问题描述】:

环境

环境: 操作系统:macOS High Sierra 10.13.4 节点:8.11.3 纱线:未找到 npm:5.6.0 守望者:4.9.0 Xcode:Xcode 9.2 构建版本 9C40b Android Studio:3.1 AI-173.4907809

包:(需要 => 已安装) 反应:^16.4.2 => 16.4.2 反应原生:0.55.4 => 0.55.4

说明

我正在编写一个自定义的原生 android 库,它公开了一个支持片段以供显示。我在 react 的 android 端创建了一个简单的视图管理器,其中我在createViewInstance 中返回了一个占位符布局(只是父线性布局内的框架布局,稍后用片段布局替换),然后打算在里面添加库片段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 获取支持片段管理器?

【问题讨论】:

  • 我将 react native 升级到最新版本,仍然存在这个问题。

标签: android react-native android-fragments react-context


【解决方案1】:

对于遇到此问题的任何其他人,目前不可能,因为ReactActivity 没有扩展AppCompatActivity,它在内部扩展了 FragmentActivity,然后提供对支持片段管理器的访问。在 react 的 github 页面上打开了一个拉取请求,该请求解决了这个问题,并且已经发布了时间表。

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2012-04-04
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多