bugfix: the wrong z-order after startFragmentAndDestroyCurrent. #509

This commit is contained in:
cgspine
2019-02-18 16:59:18 +08:00
parent b0c34dc7cb
commit 22b60b679b
3 changed files with 37 additions and 5 deletions
@@ -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();
}
@@ -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;
}
@@ -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();
}
}