2015-03-04 20 views
5

Şu anda üzerinde çalıştığım uygulama bir Gezinme Çekmecesi kullanıyor ve her sekme etkinlikte yeni bir parça açıyor (eski olanın değiştirilmesi).Yeni bir işlemde Android Fragmanı nasıl açabilirim?

Bu Fragmentlerden biri bir Unity3D sahnesidir. Temelde, ne yaptım oldu:

  1. ihracat
  2. (UnityPlayerNativeActivity idi) o verdi Aktivite
  3. dönüştürmek Fragment bu UnityPlayerNativeActivity açmak Android uygulaması olarak Birlik projesi, gösterildiği gibi aşağıdaki kod. Manifest'te bazı küçük şeyleri de değiştirdim. Burada

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

sorun mUnityPlayer.quit() fonksiyonu ile. Belirtildiği gibi, here, mUnityPlayer.quit() işlevi, içinde çalıştığı işlemi tamamen öldürür. Temel olarak, ne olur ne olmaz (örneğin, NavigationDrawer'daki sekmeleri değiştirir), UnityPlayerNativeFragment'in onDestroy'u çağırır. .

Bunu istemiyorum. İdeal olarak, kullanıcı NavigationDrawer'daki başka bir sekmeye geçecek ve o da Unity sahnesinin sekmesine geri döndüğünde, tam olarak nerede bıraktığıdır. Uygulamaları değiştirmek ve geri dönmek için Android çoklu görevini kullandıkları gibi - hiçbir şey değişmez.

Bu bir Etkinlik olsaydı, Manifest dosyasında android:process=":UnityKillsMe" satırını ekleyerek ana uygulamadan farklı bir işlemde açmak mümkün olurdu, ancak bu bir parça için mümkün değil. Yani, benim soruları: .quit() fonksiyonu benim tüm uygulamaları kapatmak kalmaması

  1. nasıl yeni bir süreç içinde UnityPlayerNativeFragment açabilir ve bu yüzden fragman tekrar başlatabilirsiniz o zaman kullanıcı yaprakları sekmesini ve sonra ona geri döner?
  2. Q1'i başarabilsem bile, durum sorunu devam ediyor. Unity sahnesini bırakıp yeniden yüklediğinizde, varsayılan görünümden başlayarak yeniden oluşturulacak ve sahip olduğu tüm özellikleri kaybedecek (örneğin, bir oyun olduğunu hayal et, sonra tüm veriler kaybolacak). Öyleyse soru 2: aynı uygulamadaki başka bir sekmeye nasıl geçebilirim, daha sonra sahne sekmesini değiştirmeden Birlik sekmesine nasıl dönebilirim? (Aslında, hiç bırakmadan arka planda çalışmasını sağlayarak). İşte

I (MainActivity itibaren) parçalarını değiştiriyorum edebilirsiniz: kodunuz için

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

cevap

0

teşekkürler. Birlik etkinliğinin bir parçaya nasıl değiştirileceğine ilişkin kodu buluyorum.

Sorunuz için, neden mUnityPlayer.quit(); Destory() yönteminde. onDestory yöntemi, parça bitişini ifade eder. aktivite değil.

Bırakma yöntemini kaldırmayı düşünüyorum. MainActivity onDestroy olduğunda, MainActivity ile parçanın arasına bir dinleyici ekleyin, birliği sonlandırmak için parça yöntemini çağırın.

İlgili konular