如何在每次单击底部导航视图时避免重新创建新活动

时间:2018-09-30 19:22:15

标签: android android-activity bottomnavigationview

我有一个perl -i -pe's/^(?= \*= require_tree \.$)/ *= require iziToast\n/' file ,其中包含3个选项。单击每个选项都会使用BottomNavigationView启动活动。然后根据每个活动中的操作,我将在其上附加/替换片段。

现在我面临的问题是,每次单击startActivity选项时,都会创建一个新活动,并且以前打开的活动也会丢失,附加的片段状态也会丢失。

我想要实现的是每当单击一个选项时,我只想切换到该活动(如果已创建并保持其状态)。

XML

BottomNavigationView

启动活动的代码段

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="gpacalculator.code.monks.gpacalculator2.BaseActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:theme="@style/ToolbarStyle"
/>
<include
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"
    android:id="@+id/result_display_include"
    layout="@layout/display_result_include"
/>
</android.support.design.widget.AppBarLayout>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/saveFAB"
    android:src="@drawable/ic_save_black_24dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    app:fabSize="normal"
    app:layout_anchor="@id/result_display_include"
    app:layout_anchorGravity="bottom|right|end"
/>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/savedFAB"
    android:src="@drawable/ic_done_black_24dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    app:fabSize="normal"
    app:layout_anchor="@id/result_display_include"
    app:layout_anchorGravity="bottom|right|end"
    app:backgroundTint="#00cc99"
/>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/frameLayout"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>


<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/navigation" />

</android.support.design.widget.CoordinatorLayout>

到目前为止,我已经尝试过使用各种意图标志,例如FLAG_ACTIVITY_REORDER_TO_FRONT,但似乎没有任何作用。

有什么可行的解决方案可以实现吗?

所有解决方案都在讨论避免重新创建片段。我很惊讶,没有我能在哪里找到活动的解决方案。

4 个答案:

答案 0 :(得分:0)

您是否尝试过更改清单中活动的启动模式?您可以使用singleTop,它将检测活动是否已经存在,如果是这种情况,则将意图发送给该实例,而不是重新创建新实例。

<activity
    android:name="your_activity_name"
    android:launchMode="singleTop"
    // rest of your activity declaration
    />

您还可以选择其他选项,例如SingleInstance和singleTask,以确保创建活动的一个和一个实例,尽管在大多数情况下不建议使用这些实例。

您可以在此处了解有关启动模式的更多信息:documentation

答案 1 :(得分:0)

您有很多选择来保存活动或片段状态,对我来说,我发现创建包含此类静态变量的内存类的最佳方法是

max_value = 5

def main():
    global max_value
    #This line requests from you to put an input with 5 digits
    num1 = raw_input("Please enter a number with 5 digits\n")
    bol = check_everything(num1)
    if bol is False:
        while (len(num1) != max_value) or (num1.isdigit() == False):
            num1 = raw_input("Please enter a number with 5 digits and with 
digits only\n")
    num1 = int(num1)
    printer(num1)


def check_everything(num1):
    if (len(num1) == max_value) and (num1.isdigit() == True):
        return True
    else:
        return False


def printer(num1):
    summ = 0
    s1 = ''
    for x in xrange(max_value):
        s1 += str(num1)[x] + ','
    print s1[:-1:]
    while num1 != 0:
        summ += num1 % 10
        num1 /= 10
    print(str(summ))


if __name__ == '__main__':
    main()

,在Activity中,使用onPause()保存状态,使用onResume()检索状态,如下所示:

   class MemoryClass {
   static String value1="";
   }

答案 2 :(得分:0)

您将通过调用finish()内部的函数NavigationItemSelectedListener从堆栈中删除活动。删除此行并将其与标志FLAG_ACTIVITY_REORDER_TO_FRONT结合使用,它应该可以正常工作。

答案 3 :(得分:0)

</tr>