जिस एप्लिकेशन पर मैं वर्तमान में काम कर रहा हूं वह एक नेविगेशन ड्रॉवर का उपयोग करता है, और प्रत्येक टैब गतिविधि में एक नया टुकड़ा खोलता है (पुराने को बदलता है)।मैं एक नई प्रक्रिया में एंड्रॉइड फ्रैगमेंट कैसे खोल सकता हूं?
इनमें से एक टुकड़ा एकता 3 डी दृश्य है। असल में, क्या मैंने किया था:
- निर्यात
- गतिविधि है कि यह दिया (जो UnityPlayerNativeActivity था)
परिवर्तित एक टुकड़ा करने के लिए इस UnityPlayerNativeActivity को खोलने के एक Android ऐप्लिकेशन के रूप में एकता परियोजना, के रूप में में दिखाया गया है नीचे कोड मैंने मैनिफेस्ट में कुछ मामूली चीज़ों को भी बदल दिया।
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() पूरी तरह से उस प्रक्रिया को मारता है जिसमें यह चल रहा है। इसलिए मूल रूप से क्या होता है कि जब मैं टुकड़े स्विच करता हूं (यानी, नेविगेशन ड्रावर में स्विच टैब), तो पूरे ऐप से बाहर निकलता है, क्योंकि यह यूनिटीप्लेयरनेटिव फ्रैगमेंट पर ऑनस्ट्रॉय को कॉल करता है ।
मुझे यह नहीं चाहिए। आदर्श रूप में, उपयोगकर्ता नेविगेशन ड्रावर में एक और टैब पर स्विच करेगा, और जब वह यूनिटी दृश्य के टैब पर वापस आ जाएगा, तो वह वही है जहां उसने इसे छोड़ा था। हालांकि उन्होंने एंड्रॉइड मल्टी-टास्किंग का इस्तेमाल ऐप बदलने और वापस करने के लिए किया - कुछ भी नहीं बदला।
यदि यह एक गतिविधि थी, तो इसे मैनिफेस्ट फ़ाइल में android:process=":UnityKillsMe"
लाइन जोड़कर मुख्य ऐप की तुलना में इसे एक अलग प्रक्रिया में खोलना संभव होगा, लेकिन यह एक टुकड़े के लिए संभव नहीं है। तो, मेरे सवालों का:
- मैं कैसे UnityPlayerNativeFragment एक नई प्रक्रिया में, खोल सकते हैं ताकि .quit() फ़ंक्शन अपने पूरे एप्लिकेशन को समाप्त नहीं करता है, और इसलिए मैं टुकड़ा पुन: लॉन्च सकते हैं कि जब उपयोगकर्ता पत्ते टैब और उसके बाद वापस आती है?
- भले ही मैं क्यू 1 प्राप्त कर सकूं, फिर भी राज्य का मुद्दा बना रहता है। एकता दृश्य को छोड़कर और फिर पुनः लोड करने से इसे फिर से बनाया जाएगा, डिफ़ॉल्ट दृश्य से शुरू होगा, और उसके पास कोई भी गुण खो जाएगा (उदा। कल्पना करें कि यह एक गेम था, फिर सभी डेटा खो जाएंगे)। तो प्रश्न 2 है: मैं एक ही ऐप में दूसरे टैब पर कैसे जा सकता हूं, फिर दृश्य परिवर्तन के बिना, यूनिटी टैब पर वापस आ सकता हूं? (अनिवार्य रूप से, इसे बिना छोड़ दिए पृष्ठभूमि में चल रहा है)।
यहाँ कैसे मैं टुकड़े स्विचिंग कर रहा हूँ (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();
}
}