我有两项活动: MainActivity 和 OtherActivity 。 MainActivity 中的片段启动 OtherActivity ,但是当我按下顶部的后退按钮时,它会返回 MainActivity 而不是片段启动了 OtherActivity 。
最终结果是将最终用户发送回主屏幕而不是他们正在使用的片段。
这是我的清单。我已将 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 中,当用户点击某个按钮时,它会加载一个List片段:
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);
}
在List 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中定义,并在列表片段中单击一个项目时启动OtherActivity。
这是 OtherActivity :
public class OtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
}
}
现在,当我点击 OtherActivity 中的后退箭头按钮时,应用只会显示 MainActivity ,而不会显示用户上次看到的List片段。
如何确保从OtherActivity返回时,用户将再次看到列表片段以获得更好的用户体验?
编辑:似乎对“后退”按钮感到困惑。也许他们是一样的,但我在谈论切换活动时的那个。它不是用于退出应用程序的后退按钮。 See image
答案 0 :(得分:0)
只需删除此行fragmentTransaction.addToBackStack(null);
答案 1 :(得分:0)
你可以使用getSupportFragmentManager()。getBackStackEntryCount(); MainActivity的onBackPressed方法中的方法。 OnClick bottom系统后退按钮。 按照以下方法。
@Override
public void onBackPressed() {
int backstack = getSupportFragmentManager().getBackStackEntryCount();
if (backstack > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
System.exit(0);
}}
在片段中,按下顶部的后退按钮。 试试这个, 在onCreate方法或Fragment的onCreateView方法中调用此默认方法
setHasOptionsMenu(true);
然后覆盖以下方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getFragmentManager().popBackStack();
break;
}
return super.onOptionsItemSelected(item);
}
答案 2 :(得分:0)
您可以将Activity用于此开始其他活动的结果,只要您想完成OtherActivity,只需执行setResult,MainActivity将收到此结果并执行以下操作
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
代码在MainActivity
中会是这样的public void callOtherActivity() {
Intent i = new Intent(this, OtherActivity.class);
startActivityForResult(i, 1);
}
并在OtherActivity的onBackPress下面调用方法。
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
现在在MainActivity onActivityresult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
}
}
}
答案 3 :(得分:0)
当您开始新活动时,现有活动会堆叠在一起,以便您稍后可以检索它,例如当您按返回键时。
按Back键,重新启动Activity。这是重要的部分。它不仅与上次使用时完全一样。这意味着您作为开发人员必须注意将Activity恢复到您希望它处于的状态。任何片段都已处于正确状态,但您必须注意不要在Activity重新启动时覆盖该状态。
在您的情况下,我怀疑您的MainActivity代码不加选择地重新初始化您的片段,而不是检查该特定活动是否已存在片段,然后才有条件地初始化它们。
由于您未在问题中包含任何代码,因此很难确定。检查显示MainActivity中片段的代码。在显示它们之前,您是否正在检查是否已显示碎片?如果没有,你应该是。
例如,下面的Activity中的代码首先检查片段是否已在添加新片段之前显示。基本上,第一次运行时,将没有片段,因此existing
将为null,并且将创建并显示新的片段。
启动新的OtherActivity
等,然后使用Back键返回此活动后,existing
将不再为null,因为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();
}
}
希望这很清楚。
答案 4 :(得分:0)
我可能迟到了,但由于MainActivity的OnStart方法中的LoadFragment方法,出现了错误