Android:使用工具栏上的相同活动导航返回

时间:2019-02-21 21:34:49

标签: android android-toolbar

我有一个activity,其中有一个layouts。每当我想从一种布局转到另一种布局时,我都使用Visibility属性。 但是我有一个toolbar,而且由于我总是有相同的活动,所以我不知道如何设置导航。

在正常情况下,如果有更多活动,我会使用android:parentActivityName属性,但是在这种情况下,我不能使用,因为是相同的活动。

部分代码:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- SIGN-IN SCREEN -->
<LinearLayout android:id="@+id/screen_sign_in" style="@style/LLScreen">
    <TextView style="@style/GameTitle" />
    <TextView style="@style/GameBlurb" />

    <com.google.android.gms.common.SignInButton android:id="@+id/button_sign_in"
        style="@style/SignInButton" />
</LinearLayout>

<!-- MAIN SCREEN -->
(...)

我用来更改屏幕的可见性代码:

void switchToScreen(int screenId) {
        // make the requested screen visible; hide all others.
        for (int id : SCREENS) {
            findViewById(id).setVisibility(screenId == id ? View.VISIBLE : View.GONE);
        }

我该如何解决?

1 个答案:

答案 0 :(得分:2)

您的主要问题是您显示“屏幕”的方法是非常规的。与使用“活动”或“片段”的常规方法不同,您只是在切换显示可见性的视图可见性。

因此,此方法的唯一解决方案是为显示的内容构建自己的缓存。

使用任何数据类型(例如List)都可以轻松完成此操作。对于此答案,我将以List为例。

因此,首先创建一个List的实例,以将屏幕的历史记录存储在Activity内:

List<Integer> listOfScreens = new ArrayList<Integer>();

接下来,请确保在切换屏幕时添加到此列表:

listOfScreens.add(screenId);
switchToScreen(screenId);

这样,您可以将新屏幕添加到列表中,然后切换到适当的屏幕。

最后,在导航和onBackPressed()代码中,只需删除列表中的最后一个屏幕,然后再次切换即可。

@Override
public void onBackPressed() {
    listOfScreens.remove(listOfScreens.size()-1);
    switchToScreen(listOfScreens.get(listOfScreens.size()-1));
}

您将删除列表的最后一项,即当前屏幕,然后将可见性切换回上一个屏幕。

我已经在onBackPressed()方法中显示了执行此操作的代码,因此对工具栏中的“向上导航”也是如此。