gpt4 book ai didi

android - 如何从另一个 Activity 转到一个 Activity 的 fragment ?

转载 作者:行者123 更新时间:2023-11-29 19:35:40 25 4
gpt4 key购买 nike

我有一个 DrawerMenuActivity 假设为“AA”,它有 3 个 fragment “A”、“B”和“C”作为它的菜单。 fragment “A”是我的默认屏幕。现在我已经导航到具有 ListView 项目的 fragment “B”,每次单击项目都会打开另一个新 Activity “AB”。在 AB 中会有一个按钮,单击该按钮将打开另一个 Activity “AC”。所以基本上流程如下,

从 AA(DrawerMenuActivity) -> "A" fragment -> "B"或 "C" fragment -> AB(Activity) -> AC(Activity)

现在我要做的是从 Activity “AC”返回到 fragment “B”。

我已经像这样替换了 Activity “AA”的 fragment ,

在 OnCreate() 中,

if (savedInstanceState == null) {
A fragment = new A();
replaceFragment(fragment, false, Constants.HOME_FRG_TAG);
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
if (getIntent().getStringExtra("FROM AC") != null) {
updateDisplay(1);
}
}
};
handler.postDelayed(runnable, 10);
}

并用于替换 fragment ,

public void updateDisplay(int position) {
Fragment fragment = null;
String tag = null;
switch (position) {
case 0:
clearStack();
mDrawerLayout.closeDrawer(mDrawerList);
break;
case 1:
fragment = new B();
tag = "B";
break;
case 2:
fragment = new C();
tag = "C";
break;
default:
break;
}

if (fragment != null) {
replaceFragment(fragment, true, tag);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
Log.e("Activity", "Error in creating fragment");
}
}

replaceFragment() 函数,

public void replaceFragment(Fragment newFragment, boolean backStackTag, String fragmentTag) {
try {
Fragment selectedFrag = getSupportFragmentManager().findFragmentByTag(fragmentTag);
if (selectedFrag != null && selectedFrag.isVisible()) {
return;
}
FragmentManager fm = AA.this.getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
if (backStackTag) transaction.addToBackStack(null);
transaction.commit();
} catch (Exception e) {
Log.e("exception ", " on adding fragment");
// TODO: handle exception
}
}

和 clearStack(),

public void clearStack() {
FragmentManager fm = AA.this.getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}

在 AC Activity 中,我试图像这样回到 fragment “B”,

Intent in = new Intent(AC.this, AA.class);
in.putExtra("FROM AC", "from ac");
startActivity(in);

现在这完成了我打算做的事情,但问题是当它加载 fragment “A”时会打开一小段时间然后返回到 fragment “B”。

我如何正确地从 Activity “AC”导航到 fragment “B”?请提供任何帮助...!!

最佳答案

首先,当您从 AB 转到 AC 时,像使用 startActvityForResult 一样启动它,并确保您没有传递清晰的后台堆栈标志。就像这样:

public static final int REQ_CODE = 1;

Intent in = new Intent(this, AB.class);
startActivityForResult(in, REQ_CODE);

所以backstack没有清空。替换 AA 中的 fragment 时,请这样做:

public void replaceFragment(Fragment newFragment, boolean backStackTag, String fragmentTag) {
try {
Fragment selectedFrag = getSupportFragmentManager().findFragmentByTag(fragmentTag);
if (selectedFrag != null && selectedFrag.isVisible()) {
return;
}
FragmentManager fm = AA.this.getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.container, fragmentB).commit();
} catch (Exception e) {
Log.e("exception ", " on adding fragment");
// TODO: handle exception
}
}

当您想从 Activity AC 返回时,如果您想导航回 AA,则将结果设置为 RESULT_OK,否则设置为 RESULT_CANCELED。

setResult(Activity.RESULT_OK);
finish();

在 AB 中,重写 onActivityResult 方法,它会将您发送回 AA:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQ_CODE) {
if (resultCode == RESULT_OK) {
finish();
}
}
}

因此,如果传递了 RESULT_OK,它将返回到 AA,其中 Activity 仍在 onStop() 中并且状态已保存。还要确保在 onCreate 而不是 onStart 中初始化您的 View 。

关于android - 如何从另一个 Activity 转到一个 Activity 的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com