[英]Pressing back button from one activity refreshes previous activity in stack
在从子活动按下后退按钮时,父活动将显示一秒钟并刷新自身。
在子活动中,我在java文件中有这个代码
@Override
public void onBackPressed()
{
Intent moveback =
new Intent(ClassActivityEdit.this, ClassActivity.class);
startActivity(moveback);
finish();
}
ClassActivityEdit是子类。 在清单文件代码中如下
<activity android:name=".ClassActivity"
android:label="Class Activity">
<intent-filter>
<action android:name="com.teamtreehouse.oslist.ClassActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ClassActivityEdit"
android:label="Class Activity"
android:noHistory="true">
<intent-filter>
<action android:name="com.teamtreehouse.oslist.ClassActivityEdit" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在后退按钮上我只想显示ClassActivity布局而不刷新它。
编辑: ClassActivityEdit
不会扩展ClassActivity
。 只是在ClassActivity
按下一些按钮将导致打开ClassActivityEdit
。
EDIT2
ClassActivity
的以下代码启动ClassActivityEdit
public void editListener(View v) {
Intent addNewClass =
new Intent(ClassActivity.this, ClassActivityEdit.class);
RelativeLayout buttonTableRow = (RelativeLayout) v.getParent();
TextView getCourseID = (TextView) buttonTableRow.findViewById(R.id.courseNumberActivity);
String courseIDString = getCourseID.getText().toString();
Bundle bundle = new Bundle();
//Add your data to bundle
bundle.putString("CourseIDString", courseIDString);
addNewClass.putExtras(bundle);
startActivity(addNewClass);
}
编辑3:我还有一个着陆(MAIN)活动闪烁一秒钟。 在ClassActivityEdit
活动中按下后退按钮时,登陆活动再次闪烁,然后加载ClassActivity
活动。 找到它有点棘手解决。
public class LoadingPage extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_page);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent mainIntent = new Intent(LoadingPage.this, ClassActivity.class);
startActivity(mainIntent);
}
}, 1000);
}
}
问题在于你对后退的覆盖(不需要覆盖),并且很可能是当焦点返回时你的活动所做的一个症状。
首先,如果你不覆盖onBackPress
,前一个活动将加载(这是因为backstack的默认行为)所以你不需要用新的意图手动调用它,并告诉它手动告诉它转到上一个活动。
当您的父活动(ClassActivity)再次启动时,它将经历正常的生命周期 - 它将恢复并且所有保存的实例状态都将恢复。 由于您尚未发布它,因此您需要确保onResume
和onRestart
在父活动中没有做任何事情 ,例如加载或设置数据。
如果你确实保留了你编写的onBackPress
,那么它将创建一个新实例,并且将始终调用onCreate
,除非它被标记为singleInstance
,在这种情况下将调用onNewIntent
,但这些东西似乎都不是你想要的。
为了响应你的编辑3,你需要确保LoadingPage有android:noHistory="true"
这样它就不能用于后台堆栈,然后在你启动主类时明确地完成它以清理它
在开始你的意图时,这是一个简单的调用finish
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent mainIntent = new Intent(LoadingPage.this, ClassActivity.class);
startActivity(mainIntent);
finish(); //end the wrapping activity (LoadingPage)
}
}, 1000);
您应该注意的最后一件事是向上和向后导航之间的区别。 如果您通过home / up按钮导航回来,您还应该告诉清单这两个活动是相关的。 在ClassActivityEdit
的清单条目中,您应该添加android:parentActivityName="com.teamtreehouse.oslist.ClassActivity"
只需让后退按钮执行正常操作即可。 不要覆盖它,也不要开始新的活动。 父活动低于堆栈中的子活动,因此它应在子活动完成时显示。
默认情况下,Android会将活动保留在堆栈中,因此当您从活动A转到活动B时,活动A将在您完成活动B时被带回, 除非您执行其他一些事情,例如使用launchMode
,完成A返回时B等
从您的代码中可以看到,您的问题应该通过不覆盖您的子活动中的onBackPressed()
来解决。 此外,您应该删除清单中子活动的<intent-filter>
块。
我建议阅读有关管理活动生命周期和任务以及返回堆栈的信息 。
首先,不需要覆盖onBackPressed()。 正如Doug提到的那样,父活动低于堆栈中的子活动,所以在子活动完成后,它就会显示出来。
有人建议您不要使用ActionBarActivity,因此最好在您的活动类中扩展AppCompatActivity类。
我试图复制这个问题但失败了。 所以我创建了一个类。
LandingPage.java
public class LandingPage extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_page);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(LandingPage.this, ClassActivity.class));
}
}, 1000);
}
}
ClassActivity.java
public class ClassActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.class_activity);
//Do whatever you want to do
}
public void editListener(View v)
{
Intent addNewClass = new Intent(ClassActivity.this,ClassActivityEdit.class);
RelativeLayout buttonTableRow = (RelativeLayout) v.getParent();
EditText getCourseID = (EditText) buttonTableRow.findViewById(R.id.courseNumberActivity);
String courseIDString = getCourseID.getText().toString();
addNewClass.putExtra("CourseIDString", courseIDString);
startActivity(addNewClass);
}
}
ChildActivityEdit.java
public class ClassActivityEdit extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.class_activity_edit);
String course_no = getIntent().getStringExtra("CourseIDString");
Toast.makeText(ClassActivityEdit.this,course_no,Toast.LENGTH_SHORT).show();
//Do whatever you want to do
}
}
你的问题太奇怪了! 只是不重写OnBackPressed你会得到你想要的结果。 我猜问题就在你的清单中。
机器人:noHistory = “真”
它不会让活动保留在历史堆栈中,请尝试将其删除。 也尝试这个:
机器人:launchMode = “singleInstance”
通过这样做,活动不会再次创建。
您的主要问题是您在子活动中覆盖了onBackPressed。 我从您的代码中理解的是 - ClassActivity - > Parent Activity ClassActivityEdit - > Child Activity
在manifest中,为子类指定了android:noHistory =“true”,即ClassActivityEdit活动。 所以它不会存储在堆栈中。 父母没有提到任何内容。
在您的子活动的onBackPressed中,您再次创建新的Parent活动,即使它已经存在于堆栈中。 它就在你孩子的活动之下。
即使您不覆盖onBackPressed,父活动仍将加载。 在您的情况下,它创建了许多父活动实例。
还有一件事,除非您希望您的活动处理或响应特定操作,否则您无需为清单中的活动添加意图过滤器。 根据文件,
“Intent过滤器指定活动,服务或广播接收者可以响应的意图类型。意图过滤器声明其父组件的功能 - 活动或服务可以做什么以及接收者可以处理什么类型的广播。打开组件以接收广告类型的意图,同时过滤那些对组件没有意义的组件。“
你可以使用Intent轻松移动返回Activity。 但你的后台活动刷新所有日期写入onresum()方法,然后它仔细刷新数据
在子活动中,我在java文件中有这个代码
@Override
public void onBackPressed()
{
Intent moveback =
new Intent(ClassActivityEdit.this, ClassActivity.class);
startActivity(moveback);
finish();
}
当您从父活动开始子活动时,您的父活动移动到堆栈,子活动显示在子活动的onBackPressed事件中,您创建父活动的新实例 ,并在活动生命周期onCreate事件中调用first,其中的视图按默认值创建,因此,当您单击子活动中的后退按钮而不创建父活动的新实例时,使用先前的savedInstanceState显示父活动,然后调用onResume事件。
有关详细信息,请参阅活动生命周期
将child activity
的onBackPressed()
更改为此,或者也可以从child activity
删除onBackPressed()
@Override
public void onBackPressed(){
super.onBackPressed(); // call super back pressed method
}
从parent activity
转移到child activity
时,请确保没有完成() parent activity
child activity
尝试使用FLAG_ACTIVITY_REORDER_TO_FRONT开始ClassActivity意图时。
你说,
在ClassActivityEdit活动中按下后退按钮时,登陆活动再次闪烁,然后加载ClassActivity活动。
您可能在ClassActivity中的某处调用finish(),这将导致活动从堆栈中删除。 如果是这样,请将其删除。
@Override
public void onBackPressed(){
finish();
super.onBackPressed();
}
这将解决您的问题。 finish()将破坏您的子活动,super.onBackPressed()会将您重定向到父活动。
你需要更换
startActivity(addNewClass);
同
startActivityForResult(addNewClass,101);
然后,在OnActivityResult中,您可以刷新数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==101){
if(resultCode==RESULT_CANCELED){
//refresh data accordingly
}else if(resultCode==RESULT_OK){
//refresh data accordingly
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.