[英]Swipe between Android activities as with ViewPager
在我的Android應用程序中,我有兩個獨立但相關的頂級屏幕/活動。 我希望為它們提供兩個單獨的啟動器圖標,但允許用戶在它們之間“滑動”,就像使用ViewPager一樣。
我看到的選項是:
實現兩個單獨的活動,並以某種方式允許在它們之間滑動。 問題是ViewPager不能與兩個單獨的活動一起使用。
使用兩個片段實現單個活動,並使用ViewPager在它們之間切換。 滑動很簡單,但是有可能有兩個發射器自動切換到正確的片段嗎?
以上兩種選擇中的任何一種都是可行的,還是我可以嘗試其他的東西?
我嘗試了解決方案二,但問題是單個活動無法檢測到使用了哪個啟動器圖標(請告訴我,如果我錯了)。
我的解決方案是添加兩個“虛擬”活動,然后啟動正確的“頁面”編號的主要活動。 這種方法的難點在於正確處理任務堆棧。 選擇啟動器后,必須啟動虛擬活動,並且必須向主活動發送意圖。 Android嘗試真的很難阻止你這樣做,只需將最后一個活動再次帶到前面。
這是我能想到的最好的:
虛擬活動(類似於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>
不同任務親和力的問題是兩個發射器以及主要任務都出現在“最近的應用程序”列表中。
我不會向其他任何人推薦這種方法 - 而只是使用一個啟動器圖標。
解決方案1:您可以在每次啟動其他活動時滑動。 在這種情況下,您應該修復兩個活動的過渡動畫,以便具有“滑動”效果並將兩個活動設置為SingleTask,以便在您的任務中不具有多個實例(因此您應該實現onNewIntent()方法) 。
解決方案2:Yeap這是可能的。 根據啟動器圖標,您應該每次啟動並顯示合適的片段,然后使用滑動以更改視圖。
希望這可以幫助!
我知道這是舊的,但這是我在尋找同樣問題時遇到的第一個問題。
您可以在那里找到解決方案: ViewPager用於多個活動 ,使用Fragments ...(如果您需要在早期版本的Android上運行,它也在支持庫中)
我會選擇解決方案2,不需要虛擬活動,它會減慢應用程序的啟動速度,而是可以在Manifest中添加活動別名,如下所示:
<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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.