diff --git a/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java b/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java index bffceb06..82822c63 100644 --- a/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java +++ b/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java @@ -345,6 +345,16 @@ public abstract class QMUIFragment extends Fragment { return false; } + + @Override + public boolean needReNameTag() { + return false; + } + + @Override + public String newTagName() { + return null; + } }); popBackStack(); } diff --git a/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentActivity.java b/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentActivity.java index ce68c84d..2714fbfc 100644 --- a/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentActivity.java +++ b/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentActivity.java @@ -126,6 +126,16 @@ public abstract class QMUIFragmentActivity extends InnerBaseActivity { } return false; } + + @Override + public boolean needReNameTag() { + return true; + } + + @Override + public String newTagName() { + return fragment.getClass().getSimpleName(); + } }); return index; } diff --git a/arch/src/main/java/com/qmuiteam/qmui/arch/Utils.java b/arch/src/main/java/com/qmuiteam/qmui/arch/Utils.java index 3c2eb7be..a03b499f 100644 --- a/arch/src/main/java/com/qmuiteam/qmui/arch/Utils.java +++ b/arch/src/main/java/com/qmuiteam/qmui/arch/Utils.java @@ -22,7 +22,6 @@ import android.app.Activity; import android.app.ActivityOptions; import android.os.Build; import android.os.Looper; -import androidx.fragment.app.FragmentManager; import com.qmuiteam.qmui.QMUILog; @@ -30,6 +29,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; +import androidx.fragment.app.FragmentManager; + /** * Created by Chaojun Wang on 6/9/14. */ @@ -136,30 +137,37 @@ public class Utils { } } - static void findAndModifyOpInBackStackRecord(FragmentManager fragmentManager, int backStackIndex, OpHandler handler){ + static void findAndModifyOpInBackStackRecord(FragmentManager fragmentManager, int backStackIndex, OpHandler handler) { if (fragmentManager == null || handler == null) { return; } int backStackCount = fragmentManager.getBackStackEntryCount(); if (backStackCount > 0) { - if(backStackIndex >= backStackCount || backStackIndex < -backStackCount){ + if (backStackIndex >= backStackCount || backStackIndex < -backStackCount) { QMUILog.d("findAndModifyOpInBackStackRecord", "backStackIndex error: " + "backStackIndex = " + backStackIndex + " ; backStackCount = " + backStackCount); return; } - if(backStackIndex < 0){ + if (backStackIndex < 0) { backStackIndex = backStackCount + backStackIndex; } try { FragmentManager.BackStackEntry backStackEntry = fragmentManager.getBackStackEntryAt(backStackIndex); + if (handler.needReNameTag()) { + Field nameField = backStackEntry.getClass().getDeclaredField("mName"); + nameField.setAccessible(true); + nameField.set(backStackEntry, handler.newTagName()); + } + + Field opsField = backStackEntry.getClass().getDeclaredField("mOps"); opsField.setAccessible(true); Object opsObj = opsField.get(backStackEntry); if (opsObj instanceof List) { List ops = (List) opsObj; for (Object op : ops) { - if(handler.handle(op)){ + if (handler.handle(op)) { return; } } @@ -174,5 +182,9 @@ public class Utils { interface OpHandler { boolean handle(Object op); + + boolean needReNameTag(); + + String newTagName(); } }