后退按钮和ActionbarUpButton关闭应用而不是返回

时间:2016-02-07 15:28:31

标签: android android-fragments

在我的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。谢谢你的所有答案。 :)

3 个答案:

答案 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();