gpt4 book ai didi

android - 如何在新进程中打开 Android Fragment?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:08 27 4
gpt4 key购买 nike

我目前正在开发的应用程序使用抽屉导航,每个选项卡都会在 Activity 中打开一个新 fragment (替换旧 fragment )。

其中一个 fragment 是 Unity3D 场景。基本上,我所做的是:

  1. 将 Unity 项目导出为 Android 应用
  2. 打开它提供的 Activity(即 UnityPlayerNativeActivity)
  3. 将此 UnityPlayerNativeActivity 转换为 Fragment,如下面的代码所示。我还更改了 list 中的一些小东西。

    import com.unity3d.player.*;
    import android.app.Fragment;
    import android.app.NativeActivity;
    import android.content.res.Configuration;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;

    public class UnityPlayerNativeFragment extends Fragment
    {
    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code
    private static final String ARG_SECTION_NUMBER = "section_number";

    public static UnityPlayerNativeFragment newInstance(int sectionNumber) {
    UnityPlayerNativeFragment fragment = new UnityPlayerNativeFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
    }
    // Setup activity layout
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState)
    {

    getActivity().getWindow().takeSurface(null);
    getActivity().setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
    getActivity().getWindow().setFormat(PixelFormat.RGB_565);

    mUnityPlayer = new UnityPlayer(getActivity());
    if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
    getActivity().getWindow().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
    boolean trueColor8888 = false;
    mUnityPlayer.init(glesMode, trueColor8888);
    mUnityPlayer.windowFocusChanged(true);
    mUnityPlayer.setX((float)-5);
    View playerView = mUnityPlayer.getView();
    return playerView;
    }

    // Quit Unity
    @Override
    public void onDestroy ()
    {
    mUnityPlayer.quit();
    super.onDestroy();
    }

    // Pause Unity
    @Override
    public void onPause()
    {
    super.onPause();
    mUnityPlayer.pause();
    }

    // Resume Unity
    @Override
    public void onResume()
    {
    super.onResume();
    mUnityPlayer.resume();
    }

    // This ensures the layout will be correct.
    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
    super.onConfigurationChanged(newConfig);
    mUnityPlayer.configurationChanged(newConfig);
    }

    public void onWindowFocusChanged(boolean hasFocus)
    {
    mUnityPlayer.windowFocusChanged(hasFocus);
    }
    }

这里的问题在于 mUnityPlayer.quit() 函数。如前所述here , mUnityPlayer.quit() 完全杀死了它正在运行的进程。所以基本上发生的事情是当我切换 fragment 时整个应用程序退出(即,切换 NavigationDrawer 中的选项卡),因为这调用了 UnityPlayerNativeFragment 的 onDestroy。

我不想要这个。理想情况下,用户会切换到 NavigationDrawer 中的另一个选项卡,当他/她返回到 Unity 场景的选项卡时,它就在他/她离开的位置。就好像他们使用 Android 多任务处理来更改应用程序并返回 - 没有任何变化。

如果这是一个 Activity,则可以通过在 list 文件中添加 android:process=":UnityKillsMe" 行在与主应用程序不同的进程中打开它,但这 fragment 是不可能的。所以,我的问题:

  1. 如何在新进程中打开 UnityPlayerNativeFragment,这样 .quit() 函数就不会终止我的整个应用程序,这样我就可以在用户离开选项卡然后返回时重新启动该 fragment ?
  2. 即使我能达到 Q1,仍然存在状态问题。退出然后重新加载 Unity 场景将重新创建它,从默认 View 开始,并丢失它拥有的所有属性(例如,假设这是一个游戏,那么所有数据都会丢失)。所以问题 2 是:如何在同一个应用程序中切换到另一个选项卡,然后返回到 Unity 选项卡,而场景根本没有改变? (本质上,让它在后台运行而不完全退出)。

这是我切换 fragment 的方式(来自 MainActivity):

@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
if (position==3) {
fragmentManager.beginTransaction()
.replace(R.id.container, DirectoryFragment.newInstance(position + 1))
.commit();
}
else if (position == 0) {
upnf = UnityPlayerNativeFragment.newInstance(position + 1);
fragmentManager.beginTransaction()
.replace(R.id.container, upnf, "UnityPlayerNativeFragment")
.commit();
}
else if (position == 2){
fragmentManager.beginTransaction()
.replace(R.id.container, WeatherFragment.newInstance(position + 1))
.commit();
}
else if (position == 4) {
fragmentManager.beginTransaction()
.replace(R.id.container, SettingsFragment.newInstance(position + 1))
.commit();
//Log.d("worked pos=4","worked pos=4");
}
else{
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
}

最佳答案

感谢您的代码。我正在查找如何将统一 Activity 更改为 fragment 的代码。

对于你的问题,我在想你为什么需要调用 mUnityPlayer.quit();在 Destory() 方法上。 onDestory 方法意味着 fragment 完成。不是 Activity 。

我想删除 quit 方法。在fragment和MainActivity之间添加监听器,当MainActivity onDestroy时,调用fragment方法调用unity quit。

关于android - 如何在新进程中打开 Android Fragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28856016/

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