Android 从ViewPager启动新活动并返回到同一页面
在我的应用程序中,有一个viewpager,其中包含3个片段。Android 从ViewPager启动新活动并返回到同一页面,android,android-fragments,android-activity,android-viewpager,Android,Android Fragments,Android Activity,Android Viewpager,在我的应用程序中,有一个viewpager,其中包含3个片段。 在其中一个片段中,我开始另一个活动。 我希望用户返回到之前备份/备份时所处的同一个viewpager页面 我使用承载viewpager的onPause和onResume方法的活动成功地实现了它。它起作用了,但问题是onResume在onCreate之后被触发,这导致应用程序在同一页面启动(而不是在onCreate方法中设置的“默认”页面) 然后我尝试将onResume代码放在启动活动的onOptionsItemSelected方法中
在其中一个片段中,我开始另一个活动。
我希望用户返回到之前备份/备份时所处的同一个viewpager页面 我使用承载viewpager的
onPause
和onResume
方法的活动成功地实现了它。它起作用了,但问题是onResume
在onCreate
之后被触发,这导致应用程序在同一页面启动(而不是在onCreate
方法中设置的“默认”页面)
然后我尝试将onResume
代码放在启动活动的onOptionsItemSelected
方法中,但根本不起作用
启动活动:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
vpPref = getPreferences(MODE_PRIVATE);
int value = vpPref.getInt("viewPagerPage", -1);
if (value != -1) {
MainActivity.instance.mPager.setCurrentItem(value);
vpPrefEditor = vpPref.edit();
vpPrefEditor.remove("viewPagerPage");
vpPrefEditor.commit();
}
return true;
}
return super.onOptionsItemSelected(item);
}
主要活动:(主持viewpager)
问题出在第一个代码中。我不知道这是一个放置问题还是获取了错误的MainActivity
实例
这种行为的原因可能是什么?从
MainActivity
访问ViewPager
是一种不好的方式(我希望MainActivity.instance
不是一个静态字段,其中包含对MainActivity
实例的引用)。您应该让main活动
完全处理ViewPager
的位置:
在main活动的onPause()
中,您将保留当前代码。在main活动的onResume()
方法中,您将有:
@Override
public void onResume() {
super.onResume();
vpPref = getPreferences(MODE_PRIVATE);
final int value = vpPref.getInt("viewPagerPage");
final boolean shouldRestore = vp.getboolean("restoreStatusFlag");
// we are again in the MainActivity so also make
// restoreStatusFlag as false in the preferences
if (shouldRestore) {
mPager.setCurrentItem(value);
}
}
shouldRestore
首选项将从onCreate
中启动的活动中设置。这样,如果启动了MainActivity
,您将保留默认页面(shouldRestore
将为false,因为启动的活动尚未运行)。如果在main活动
之后转到启动的活动,则shouldRestore
将变为true
(您需要在onCreate
中进行设置),当您返回时,查看页面
将在onResume()中设置到右侧页面
这就留下了这样一个场景,用户可以转到已启动的活动(shouldRestore
将为true),但不会返回到MainActivity
。为此,您可以从启动MainActivity
的Intent
中测试该类别(我假设它是清单中提到的启动器活动):
Set catg=getIntent().getCategories();
用于(字符串类别:catg){
if(类别等同(意图类别_发射器)){
//将shouldRestore标志重置为false,这样我们就得到了默认页面
打破
}
}
很抱歉回复太晚-非常感谢!顺便问一下,有没有其他更好的方法来访问MainActivity
的实例?或者这根本不是一个好的做法?我知道可以在片段内部使用getActivity()
,广播者/接收者可以进行不同的活动。@xTCx是从外部访问MainActivity的更好方法(像其他活动一样?)。如果是,则应避免这种情况,因为一旦活动
调用onPause()
,该活动可能会被系统终止,因此尝试在另一个活动中访问它会带来问题。
@Override
public void onResume() {
super.onResume();
vpPref = getPreferences(MODE_PRIVATE);
final int value = vpPref.getInt("viewPagerPage");
final boolean shouldRestore = vp.getboolean("restoreStatusFlag");
// we are again in the MainActivity so also make
// restoreStatusFlag as false in the preferences
if (shouldRestore) {
mPager.setCurrentItem(value);
}
}
Set<String> catg = getIntent().getCategories();
for (String cat : catg) {
if (cat.equals(Intent.CATEGORY_LAUNCHER)) {
// reset the shouldRestore flag to false so we end up with the default page
break;
}
}