2015-03-04 14 views
5

Ứng dụng tôi hiện đang làm việc trên sử dụng Ngăn điều hướng và mỗi tab sẽ mở ra một đoạn mới trong hoạt động (thay thế tệp cũ).Tôi làm cách nào để mở Phân đoạn Android trong một quy trình mới?

Một trong những Phân đoạn này là cảnh Unity3D. Về cơ bản, những gì tôi đã làm là:

  1. xuất khẩu dự án Unity là một ứng dụng Android
  2. mở Hoạt động mà nó đã cho (mà là UnityPlayerNativeActivity)
  3. convert UnityPlayerNativeActivity này cho một người Fragment, như thể hiện trong mã bên dưới. Tôi cũng đã thay đổi một số thứ nhỏ trong Tệp kê khai.

    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); 
    } 
    } 
    

Vấn đề ở đây là với mUnityPlayer.quit() chức năng. Vì vậy, về cơ bản những gì xảy ra là toàn bộ ứng dụng thoát khi tôi chuyển đổi các mảnh (ví dụ, chuyển đổi các tab trong NavigationDrawer), bởi vì nó gọi onDestroy của UnityPlayerNativeFragment .

Tôi KHÔNG muốn điều này. Lý tưởng nhất, người dùng sẽ chuyển sang một tab khác trong NavigationDrawer và khi anh ta/cô ấy quay trở lại tab của cảnh Unity, đó chính xác là nơi anh ta/cô ấy rời khỏi nó. Như thể họ đã sử dụng tính năng đa tác vụ Android để thay đổi ứng dụng và trả lại - không có gì thay đổi.

Nếu đây là một Hoạt động, bạn có thể mở nó trong một quy trình khác với ứng dụng chính bằng cách thêm dòng android:process=":UnityKillsMe" vào tệp kê khai, nhưng điều này không thể cho một đoạn. Vì vậy, câu hỏi của tôi:

  1. Làm thế nào tôi có thể mở UnityPlayerNativeFragment trong một quá trình mới, do đó .quit() chức năng không giết chết toàn bộ ứng dụng của tôi, và vì vậy mà tôi có thể relaunch đoạn khi những chiếc lá dùng và sau đó quay lại tab đó?
  2. Thậm chí nếu tôi có thể đạt được Q1, vẫn còn vấn đề của tiểu bang. Thoát và sau đó tải lại cảnh Unity sẽ tạo lại cảnh mới, bắt đầu từ chế độ xem mặc định và mất bất kỳ thuộc tính nào (ví dụ: tưởng tượng đó là trò chơi, khi đó tất cả dữ liệu sẽ bị mất). Vì vậy, câu hỏi 2 là: làm thế nào tôi có thể chuyển sang tab khác trong cùng một ứng dụng, sau đó quay lại tab Unity, mà không có thay đổi cảnh nào cả? (Về cơ bản, giữ cho nó chạy trong nền mà không bỏ nó ở tất cả).

Đây là cách tôi đang chuyển mảnh (từ 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(); 
     } 
    } 

Trả lời

0

nhờ cho mã của bạn. Tôi đang tìm mã để thay đổi hoạt động thống nhất thành một đoạn.

Đối với câu hỏi của bạn, tôi nghĩ tại sao bạn cần gọi mUnityPlayer.quit(); trên phương thức Destory(). phương thức onDestory có nghĩa là kết thúc đoạn. không phải là hoạt động.

Tôi nghĩ rằng hãy xóa phương thức thoát. thêm một trình lắng nghe giữa đoạn với MainActivity, khi MainActivity onDestroy, gọi phương thức phân đoạn để gọi sự unity quit.

Các vấn đề liên quan