在Android中如何像ViewPager一样在不同的活动之间切换?

6
在我的Android应用程序中,我有两个独立但相关的顶级屏幕/活动。我想为它们拥有两个单独的启动器图标,但允许用户像使用ViewPager一样在它们之间“滑动”。
我看到的选项有:
1.实现两个独立的活动,并以某种方式允许在它们之间滑动。问题是ViewPager不能与两个独立的活动一起使用。
2.实现一个带有两个片段的单个活动,并使用ViewPager在它们之间切换。滑动很简单,但是否可能拥有两个启动器,可以自动切换到正确的片段?
以上两个选项中的任何一个都可行吗?还是我可以尝试其他方法?
4个回答

3
我尝试了第二种解决方案,但问题在于单个活动无法检测使用了哪个启动器图标(如果我错了,请告诉我)。
我的解决方案是添加两个“虚拟”活动,然后启动主要活动,该活动具有正确的“页面”编号。这种方法的难点在于正确处理任务栈。当选择启动器时,必须启动虚拟活动,并向主要活动发送意图。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>

不同任务关联的问题在于启动器和主要任务都会出现在“最近应用程序”列表中。我不建议其他人采用这种方法,而是只使用单个启动器图标。

2
解决方案1:您可以每次滑动时启动其他活动。在这种情况下,您应该修复两个活动的转换动画,以便具有“滑动”效果,并将两个活动设置为SingleTask,以便在任务中不会有多个实例(因此您应该实现onNewIntent()方法)。
解决方案2:是的,这是可能的。根据启动器图标,您应该每次启动并显示适当的片段,然后使用滑动来更改视图。
希望这可以帮助!

对于解决方案2,你如何检测使用了哪个启动图标?这个信息是否包含在启动意图中? - Ralf
您可以在启动处理片段的活动的意图中添加额外内容。 - Dimitris Makris
我想要两个主屏幕启动器来启动活动,所以我无法向这些意图添加任何额外的内容。 - Ralf

1
我会选择解决方案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活动中,您可以检查使用哪个启动器调用了您,您可以通过查找启动器activity-alias名称或检查我上面添加的元数据来实现:

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

0

我知道这已经过时了,但这是我在寻找同样问题时遇到的第一个问题。

你可以在这里找到解决方案:多个活动的ViewPager,使用Fragments...(如果需要在早期版本的Android上运行,也可以在支持库中找到)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接