2011-10-29 20 views
6

मेरे एंड्रॉइड एप्लिकेशन में मेरे पास दो अलग लेकिन संबंधित शीर्ष-स्तरीय स्क्रीन/गतिविधियां हैं। मैं उनके लिए दो अलग लॉन्चर आइकन रखना चाहता हूं, लेकिन उपयोगकर्ता को उनके बीच "स्वाइप" करने की अनुमति देता हूं, जैसे ViewPager के साथ।एंड्रॉइड गतिविधियों के बीच स्वाइप करें ViewPager

विकल्प मैं देख रहा हूँ कर रहे हैं:

  1. दो अलग-अलग गतिविधियों को लागू है, और उन्हें किसी भी तरह के बीच स्वाइप अनुमति देते हैं। मुद्दे यह है कि ViewPager का उपयोग दो अलग-अलग गतिविधियों के साथ नहीं किया जा सकता है।

  2. दो टुकड़ों के साथ एक गतिविधि को कार्यान्वित करें, और उनके बीच स्विच करने के लिए ViewPager का उपयोग करें। स्वाइपिंग सरल है, लेकिन क्या दो लांचर होना संभव है जो स्वचालित रूप से सही टुकड़े पर स्विच हो जाते हैं?

क्या उपरोक्त दो विकल्पों में से कोई भी व्यवहार्य है, या क्या मैं कुछ और कोशिश कर सकता हूं?

उत्तर

1

समाधान 1: आप हर बार दूसरी गतिविधि शुरू करने के मामले में स्वाइप कर सकते हैं। इस मामले में आपको "स्वाइपिंग" प्रभाव प्राप्त करने के लिए दो गतिविधियों के लिए संक्रमण एनीमेशन को ठीक करना चाहिए और दो कार्य को सिंगलटास्क के रूप में सेट करना चाहिए ताकि आपके कार्य में कई उदाहरण न हों (इस प्रकार आपको ऑन न्यूंटेंट() विधि को कार्यान्वित करना चाहिए) ।

समाधान 2: हाँ यह संभव है। लॉन्चर आइकन के आधार पर, आपको प्रत्येक बार उपयुक्त टुकड़ा शुरू करना और दिखाना चाहिए और फिर दृश्यों को बदलने के लिए स्वाइप का उपयोग करना चाहिए।

आशा है कि इससे मदद मिलती है!

+0

समाधान 2 के लिए, आप कैसे पता लगाते हैं कि कौन से लॉन्चर आइकन का उपयोग किया गया था? क्या यह जानकारी लॉन्चिंग मंशा में मौजूद है? – Ralf

+0

आप उस उद्देश्य को अतिरिक्त जोड़ सकते हैं जो टुकड़ों को संभालने वाली गतिविधि शुरू करता है। –

+0

मैं दो होम स्क्रीन लॉन्चर्स को गतिविधि शुरू करने के लिए चाहता हूं, इसलिए मैं उन उद्देश्यों में कोई अतिरिक्त जोड़ नहीं पा रहा हूं। – Ralf

2

मैंने समाधान दो की कोशिश की, लेकिन मुद्दा यह है कि एक ही गतिविधि यह पता नहीं लगा सकती कि कौन सा लॉन्चर आइकन इस्तेमाल किया गया था (कृपया मुझे बताएं कि क्या मैं गलत हूं)।

मेरा समाधान दो "डमी" गतिविधियों को जोड़ना था, जो तब मुख्य गतिविधि लॉन्च करते थे जो सही "पृष्ठ" संख्या है। इस दृष्टिकोण के साथ कठिनाई ठीक से कार्य ढेर को संभालना है। जब लॉन्चर का चयन किया जाता है, तो डमी गतिविधि लॉन्च की जानी चाहिए, और इसे मुख्य गतिविधि के लिए एक इरादा भेजना होगा। एंड्रॉइड आपको ऐसा करने से रोकने के लिए वास्तव में कड़ी मेहनत करता है, और केवल अंतिम गतिविधि को सामने लाएं।

डमी गतिविधियों (LaunchActivity2 के लिए समान):

public class LaunchActivity1 extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent newIntent = new Intent(this, MainActivity.class); 
     newIntent.putExtra(MainActivity.EXTRA_PAGE, 1); 
     newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(newIntent); 
     finish(); 
    } 
} 

मुख्य गतिविधि में:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 
    ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager); 
    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager())); 

    int page = getIntent().getIntExtra(EXTRA_PAGE, -1); 
    if(page >= 0 && page <= NUM_ITEMS) 
     viewPager.setCurrentItem(page); 
} 

public void onNewIntent(Intent intent) { 
    if(intent.hasExtra(EXTRA_PAGE)) { 
     int page = intent.getIntExtra(EXTRA_PAGE, -1); 
     ViewPager viewPager = (ViewPager)findViewById(R.id.MainViewPager); 
     if(page >= 0 && page <= NUM_ITEMS) 
      viewPager.setCurrentItem(page); 
    } 
} 

AndroidManifest.xml

यह सबसे अच्छा मैं के साथ आ सकता है:

<!-- LaunchActivity2 is similar --> 
    <activity android:name=".LaunchActivity1" android:label="Launch 1" 
       android:clearTaskOnLaunch="true" 
       android:noHistory="true" 
       android:taskAffinity="Launch1" 
       android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <activity android:name=".MainActivity" 
       android:label="My App" 
       android:clearTaskOnLaunch="true" 
       android:finishOnTaskLaunch="true" 
       android:launchMode="singleTask" 
       android:taskAffinity="MyApp"> 
    </activity> 

विभिन्न कार्य affinities के साथ मुद्दा यह है कि दोनों लॉन्चर्स, साथ ही मुख्य कार्य, "हालिया अनुप्रयोगों" सूची में दिखाई देते हैं।

मैं किसी और के लिए इस दृष्टिकोण की अनुशंसा नहीं करता - बल्कि केवल एक लॉन्चर आइकन का उपयोग करें।

0

मुझे पता है कि यह पुराना है, लेकिन जब मैंने एक ही समस्या की तलाश की तो मुझे यह पहला सवाल मिला।

आप वहां समाधान ढूंढ सकते हैं: ViewPager for multiple Activities, टुकड़ों का उपयोग करें ...(यदि आपको एंड्रॉइड के पुराने संस्करणों पर चलाने की आवश्यकता है तो यह समर्थन लाइब्रेरी में भी है)

0

मैं समाधान 2 के लिए जाऊंगा, डमी गतिविधियों की कोई आवश्यकता नहीं है, यह आपके ऐप के लॉन्च को धीमा कर देगा, इसके बजाय आप अपने प्रकट में गतिविधि-एलियास जोड़ सकते हैं, इस तरह:

<activity-alias 
     android:name=".MySecondLauncher" 
     android:exported="true" 
     android:icon="@drawable/my_second_icon" 
     android:label="@string/my_second_launcher" 
     android:targetActivity=".MainScreen"> 
     <meta-data 
      android:name="secondLauncher" 
      android:value="true" /> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity-alias> 

फिर, MainScreen गतिविधि में, आप देख सकते हैं कि लॉन्चर आप के साथ कहा जाता था, तो आप ऐसा कर सकते हैं लांचर गतिविधि अन्य नाम की तलाश द्वारा, या मेटा डेटा की जाँच करके मैंने ऊपर कहा:

ComponentName component = intent.getComponent(); 
String name = component.getShortClassName(); 
boolean secondLauncher = ".MySecondLauncher".equals(name); 

या:

ActivityInfo info = getPackageManager().getActivityInfo(intent.getComponent(),PackageManager.GET_META_DATA); 
boolean secondLauncher = info.metaData.getBoolean("secondLauncher", false); 
संबंधित मुद्दे