在我的MainActivity中,我有一个SlidingTabBar,从那些Tabs(片段)中我打开某些事件的其他活动(如FAB-onClick)。现在,当我打开一个活动并按下设备上的后退按钮或操作栏中的HomeAsUp(后退)按钮时,我想回到MainActivity上的Fragment,我打开了另一个Activity,但是应用程序刚关闭。
我没有任何onBackPressed方法,我不会在我打开的活动中的任何地方调用finsish()。 我只是用Fragment的意图打电话给他们:
Intent intent = new Intent(getActivity(), OfferActivity.class);
startActivity(intent);
我的MainActivity中有这个方法,因为从那里我希望能够使用后退按钮退出应用程序:
@Override
public void onBackPressed() {
finish();
}
我也有一个LoginActivity,我通过这种方式调用MainActivity(它是一个FacebookLogin,所以在第一次打开应用程序时它只是nessecary):
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
如果您需要任何其他代码,请告诉我:)
编辑:以下是我在MainActivity中将片段添加到TabLayout的代码:
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new NewsFragment(), "NEWS");
adapter.addFragment(new ProfileFragment(), "PROFILE");
adapter.addFragment(new NotificationFragment(), "NOTIF");
adapter.addFragment(new AboutFragment(), "ABOUT");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
//return mFragmentTitleList.get(position);
// null -> just use icons
return null;
}
}
编辑2:这是我的清单:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".adapter.AppController">
<activity
android:name=".main.LoginActivity"
android:label="friendlyride">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".main.MainActivity"
android:label="friendlyride">
</activity>
<activity
android:name=".main.OfferActivity"
android:label="Offer ride"
android:parentActivityName=".main.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".main.MainActivity"
/>
</activity>
</application>
main.MainActivity是我的TabLayout和main.OfferActivity是我想从Fragment打开的地方。 main.LoginActivity有intent-filter,因为它是我尚未登录时的第一个Activity(如果这个intent-filter很重要,我现在不知道))
最终编辑: 我刚发现了这个问题。我使用NO_HISTORY和CLEAR_TOP标志从LoginActivity打开MainActivity(从中打开其他所有内容)。并且显然这些标志也用于MainActivity上的Intents,即使我没有设置它们。我不知道下面的活动会“记住”标记,即使我使用没有标记的新Intent。谢谢你的所有答案。 :)
答案 0 :(得分:1)
我再试一次,因为我没有仔细阅读这个问题。
因此,如果您有活动A启动活动B,请在AndroidManifest.xml中输入:
<manifest>
<application>
<activity android:name=".ActivityA" ...etc >
<activity
android:name=".ActivityB"
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="my.package.name.ActivityA" />
</activity>
... closing tags
请注意,活动B中的android.support.PARENT_ACTIVITY
指向my.package.name.ActivityA
。
如果您没有帮助,可以提供AndroidManifest.xml文件吗?
答案 1 :(得分:1)
你应该这样做。
在您的清单文件中定义每个活动的父级,这将是用户按下后退按钮时要调用的活动,如果没有关闭应用程序的话。
所以做这样的事情。
<activity
android:name="com.youtpath.yourActivity"
android:launchMode="singleTask">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.yourPath.theMainActivityActivity" />
这将解决回来的问题,但你必须添加&#34; singleTask&#34; launchMode参数,以便只有一个MainActivity实例,当您按下时避免创建另一个MainActivity。
关于片段,FragmentManager是一个Activity字段,而不是来自应用程序,所以你不能从新的Activity调用片段回栈,因为没有。
您的问题不是片段之间的导航,而是从活动导航。
希望它能解决问题。
:)
答案 2 :(得分:0)
您需要将Fragment访问添加到Backstack。
请参阅Providing Proper Back Navigation。
特别是片段的实施后退导航:
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail")
// Add this transaction to the back stack
.addToBackStack()
.commit();