gpt4 book ai didi

android - 从另一个 Activity 返回后返回到 MainActivity 的 fragment ?

转载 作者:行者123 更新时间:2023-11-29 02:39:34 25 4
gpt4 key购买 nike

我有两个 Activity :MainActivityOtherActivityMainActivity 中的一个 fragment 启动了 OtherActivity,但是当我按下顶部的后退按钮时,它返回到 MainActivity 而不是 fragment 启动了 OtherActivity

最终结果是最终用户被送回主屏幕,而不是他们正在使用的 fragment 。

这是我的 list 。我已将 MainActivity 设置为 OtherActivity 的父级:

    <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity"
android:parentActivityName="com.example.test.MainActivity" >
</activity>

MainActivity 中,当用户点击按钮时,它会加载一个列表 fragment :

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// ...

button.findViewById(R.id.events).setOnClickListener(new View.OnClickListener() {

Fragment ef = new MyItemsFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.content, ef, "my_fragment");
fragmentTransaction.commit();
});

}

public void callOtherActivity() {
Intent i = new Intent(this, OtherActivity.class);
this.startActivity(i);
}

当单击列表 fragment 中的项目时,它会启动 OtherActivity。很多代码都是由 android studio 自动生成的。我已经改变了一些。在 MyItemsRecyclerViewAdapter 中:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mItem = mValues.get(position);

holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != mListener) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mListener.onEventFragmentInteraction(holder.mItem);

MainActivity ma = (MainActivity) holder.mView.getContext();
ma.callOtherActivity();

}
}
});
}

请注意,它会调用 ma.callOtherActivity(),它在 MainActivity 中定义,并且会在单击列表 fragment 中的项目时启动 OtherActivity。

这是OtherActivity:

public class OtherActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
}

}

现在,当我点击 OtherActivity 中的后退箭头按钮时,应用将只显示 MainActivity,而不是用户最后看到的列表 fragment 。

如何确保从 OtherActivity 返回时,用户会再次看到列表 fragment 以获得更好的用户体验?

编辑:“后退”按钮似乎令人困惑。也许它们是相同的,但我说的是切换 Activity 时的那个。它不是用于退出应用程序的后退按钮。 See image

最佳答案

当您开始一个新的 Activity 时,现有的 Activity 会堆叠起来,以便您稍后可以检索它,例如当您按返回键时。

按下返回键后, Activity 将重新启动。这是重要的部分。它不仅恢复到上次使用时的原样。这意味着您作为开发人员必须注意将 Activity 恢复到您希望它所处的状态。任何 fragment 都将处于正确的状态,但您必须注意不要在 Activity 重新启动时覆盖该状态。

在您的情况下,我怀疑您的 MainActivity 代码不加区别地重新初始化您的 fragment ,而不是检查 fragment 是否已经存在于该特定 Activity ,然后才有条件地初始化它们(仅当它们不存在时)。

很难确定,因为您没有在问题中包含任何代码。检查在 MainActivity 中显示 fragment 的代码。在显示它们之前,您是否检查是否已经有可见的 fragment ?如果不是,你应该是。

例如,下面的代码在一个 Activity 中,首先检查一个 fragment 是否已经显示,然后再添加一个新 fragment 。本质上,这是第一次运行时,不会有 fragment ,因此 existing 将为空,并且会创建并显示一个新的 fragment 。

在您开始一个新的 OtherActivity 等然后使用返回键返回到此 Activity 后,existing 将不再为 null,因为 Fragment 系统将恢复任何现有 fragment 放回您的容器中。因此我们实际上什么都不做。

@Override
protected void onCreate(Bundle b) {
super.onCreate(b);

Fragment existing = getSupportFragmentManager().findFragmentById(R.id.content);

if (existing == null) {
Fragment newFragment = new MyFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, newFragment)
.commit();
}

}

希望这是清楚的。

关于android - 从另一个 Activity 返回后返回到 MainActivity 的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158403/

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