Как избежать повторного создания нового действия каждый раз, когда щелкается нижняя навигационная панель - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть BottomNavigationView, содержащий 3 варианта.Каждая опция при нажатии запускает действие, используя startActivity.Затем, основываясь на операциях в каждом действии, я просто прикреплю / заменим фрагменты на нем.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда вы нажимаете опцию BottomNavigationView, создается новое действие, которое также открывается ранее.действие и состояние присоединенного фрагмента потеряно.

Чего я хочу добиться, так это всякий раз, когда выбирается какой-либо параметр, я просто хочу переключиться на это действие, если оно уже создано с сохранением его состояния.

XML

<?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>

Фрагмент кода, в котором запущено действие

@Override
public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
    navigationView.postDelayed( () -> {
        int itemId = item.getItemId();

        if (itemId == R.id.navigation_gpa){

            Intent gpaIntent = new Intent(this, GpaActivityContainer.class);
            //gpaIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(gpaIntent);

        }
        else if (itemId == R.id.navigation_cgpa){

            Intent cgpaIntent = new Intent(this, CgpaActivityContainer.class);
            //cgpaIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(cgpaIntent);

        }
        else if (itemId == R.id.navigation_saved){

            Intent savedIntent = new Intent(this, SavedActivityContainer.class);
            //savedIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(savedIntent);

        }
    finish();
    }, 300);
    return true;
}

Пока я пытался использоватьразличные флаги намерений, такие как FLAG_ACTIVITY_REORDER_TO_FRONT, но мне кажется, что ничего не работает.

Есть ли какое-либо возможное решение, как этого можно достичь?

Все решения говорят о том, чтобы избежать повторного создания фрагмента.Я удивлен, что нет, где я мог найти решение для деятельности.

Ответы [ 4 ]

0 голосов
/ 03 октября 2018
to avoid recreation of activtiy just use FLAG_ACTIVITY_CLEAR_TOP.

public void onClick(DialogInterface dialog, int id) {
                    Intent intent=new Intent(DriverAssignedTask.this,MapsActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                    finish();
                }
0 голосов
/ 30 сентября 2018

У вас есть много вариантов, чтобы сохранить активность или состояние фрагмента, для меня я нашел лучший способ, создав класс памяти, содержащий статические переменные, такие как:

   class MemoryClass {
   static String value1="";
   }

и в Activity используйте onPause () для сохраненияstate и onResume () для получения состояния следующим образом:

       @Override
       public void onPause() {
        super.onPause();

        MemoryClass.value1 = editText1.getText().toString();
         }


    @Override
    public void onResume() {
      super.onResume();

      editText1.setText(MemoryClass.value1);
      }
0 голосов
/ 01 октября 2018

Вы удаляете активность из стека, вызывая функцию finish() внутри вашего NavigationItemSelectedListener.Удалите эту строку и объедините ее с флагом FLAG_ACTIVITY_REORDER_TO_FRONT, и она должна работать правильно.

0 голосов
/ 30 сентября 2018

Вы пытались изменить режим запуска своей активности в своем манифесте?Вы можете использовать singleTop, который обнаружит, если действие уже существует, и в этом случае намерение будет отправлено этому экземпляру вместо воссоздания нового экземпляра.

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

У вас также есть другие варианты, такие как SingleInstance и singleTask, которые обеспечивают создание одного и только одного экземпляра действия, хотя в большинстве случаев его не рекомендуется использовать.

ВыПодробнее об использовании режимов запуска можно прочитать здесь: Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...