簡體   English   中英

與ViewPager一樣在Android活動之間滑動

[英]Swipe between Android activities as with ViewPager

在我的Android應用程序中,我有兩個獨立但相關的頂級屏幕/活動。 我希望為它們提供兩個單獨的啟動器圖標,但允許用戶在它們之間“滑動”,就像使用ViewPager一樣。

我看到的選項是:

  1. 實現兩個單獨的活動,並以某種方式允許在它們之間滑動。 問題是ViewPager不能與兩個單獨的活動一起使用。

  2. 使用兩個片段實現單個活動,並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM