我有一个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);
}
我该如何解决?
答案 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()
方法中显示了执行此操作的代码,因此对工具栏中的“向上导航”也是如此。