在我的 Android 应用程序中,我有两个独立但相关的顶级屏幕/活动。我想为它们设置两个单独的启动器图标,但允许用户在它们之间“滑动”,就像 ViewPager 一样。
我看到的选项是:
实现两个单独的活动,并以某种方式允许在它们之间滑动。问题是 ViewPager 不能与两个单独的活动一起使用。
使用两个片段实现单个活动,并使用 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>
不同任务关联的问题是启动器和主任务都出现在“最近的应用程序”列表中。
我不会向其他任何人推荐这种方法——而只是使用一个启动器图标。
解决方案一:可以在每次启动其他Activity时滑动。在这种情况下,您应该修复两个活动的过渡动画以产生“滑动”效果,并将两个活动设置为 SingleTask 以便您的任务中没有多个实例(因此您应该实现 onNewIntent() 方法) .
解决方案2:是的,这是可能的。根据启动器图标,您应该每次启动并显示合适的片段,然后使用滑动来更改视图。
希望这可以帮助!
我知道这很旧,但这是我在寻找相同问题时遇到的第一个问题。
您可以在那里找到解决方案:ViewPager for multiple Activities,使用 Fragments...(如果您需要在早期版本的 Android 上运行,它也在支持库中)
我会选择解决方案 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);