在从子活动按下后退按钮时,父活动会显示一秒钟并自行刷新。
在子活动中,我在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);
}
}
答案 0 :(得分:3)
问题在于您对后退的覆盖(不需要覆盖),并且很可能是焦点返回时您的活动所做的事情的症状。
首先,如果您不要覆盖onBackPress
,则会加载上一个活动(由于the backstack而导致的默认行为),所以你不要&# 39;需要用新意图手动调用它并告诉它手动告诉它去上一个活动。
当您的父活动(ClassActivity)再次启动时,它将通过normal lifecycle - 它将恢复并且所有已保存的实例状态都将恢复。由于您尚未发布,因此您需要确保{1}}和onResume
在您的父活动中没有做任何事情,例如加载或设置数据。
如果您确实保留了您编写的onRestart
,那么它将创建一个新实例,并且始终会调用onBackPress
,除非它被onCreate
标记,在这种情况下{{1}将被调用,但这些东西似乎都不是你想要的。
为了回应您的编辑3 ,您需要确保LoadingPage具有singleInstance
,以便后台堆栈无法使用明确地完成以在启动主类时清理它
在开始你的意图
时,这很简单,就像调用onNewIntent
一样
android:noHistory="true"
您应该注意的最后一件事是向上和向后导航之间的区别。如果您通过home / up按钮导航回来,您还应该告诉清单这两个活动是相关的。在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);
答案 1 :(得分:2)
只需让后退按钮执行正常操作即可。不要覆盖它,也不要开始新的活动。父活动低于堆栈中的子活动,因此它应该在子活动完成时显示。
答案 2 :(得分:2)
默认情况下,Android会将活动保留在堆栈中,因此当您从活动A转到活动B时,活动A将在您完成活动B 时返回,除非您执行其他一些操作混乱launchMode
,从B等返回完成A
从您的代码中可以看到,您的问题应该通过不覆盖您的子活动中的onBackPressed()
来解决。此外,您应该删除清单中儿童活动的<intent-filter>
块。
答案 3 :(得分:2)
首先,不需要覆盖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
}
}
答案 4 :(得分:2)
你的问题太奇怪了!只是不重写OnBackPressed你会得到你想要的结果。 我猜问题就在你的清单中。
机器人:noHistory = “真”
它不会让活动留在历史堆栈中,请尝试将其删除。也试试这个:
机器人:launchMode = “singleInstance”
通过这样做,活动不会再次创建。
答案 5 :(得分:2)
您的主要问题是您在子活动中覆盖了onBackPressed。 我从你的代码中理解的是 - ClassActivity - &gt;家长活动 ClassActivityEdit - &gt;儿童活动
在清单中,android:noHistory =&#34; true&#34;为子级指定,即ClassActivityEdit活动。所以它不会被存储在堆栈中。没有提到父母。
在您的子活动的onBackPressed中,您再次创建新的Parent活动,即使它已经存在于堆栈中。它就在您的孩子活动之下。
即使您不覆盖onBackPressed,父活动仍会加载。在您的情况下,它正在创建许多父活动实例。
还有一件事,除非您希望自己的活动处理或回应特定操作,否则您不需要为清单中的活动添加意图过滤器。根据文件,
&#34; Intent过滤器指定活动,服务或广播接收者可以响应的意图类型。 intent过滤器声明其父组件的功能 - 活动或服务可以做什么以及接收器可以处理什么类型的广播。它打开组件以接收广告类型的意图,同时过滤掉对组件无意义的组件。&#34;
答案 6 :(得分:1)
你可以使用Intent轻松移动返回Activity。但你的后台活动刷新所有日期写入onresum()方法,然后它非常刷新数据
答案 7 :(得分:1)
在子活动中,我在java文件中有这段代码
@Override
public void onBackPressed()
{
Intent moveback =
new Intent(ClassActivityEdit.this, ClassActivity.class);
startActivity(moveback);
finish();
}
当您从父活动开始子活动时,您的父活动将移至堆叠,子活动会显示在子活动的 onBackPressed 事件中,您可以创建父活动的新实例在活动生命周期 onCreate 事件中,首先调用它,并在其中创建默认值的视图,因此当您在子活动中单击后退按钮而不创建父活动的新实例时,android显示前一个 savedInstanceState 然后调用 onResume 事件。
有关详细信息,请参阅Activity Life Cycle
答案 8 :(得分:0)
将onBackPressed()
中的child activity
更改为此,或者您也可以从onBackPressed()
child activity
@Override
public void onBackPressed(){
super.onBackPressed(); // call super back pressed method
}
当您从parent activity
转移到parent activity
child activity
答案 9 :(得分:0)
在启动ClassActivity意图时尝试使用FLAG_ACTIVITY_REORDER_TO_FRONT。
你说,在ClassActivityEdit活动中按下后退按钮时,登陆活动会再次闪烁,然后加载ClassActivity活动。
你可能在ClassActivity中的某个地方调用finish(),这会导致活动从堆栈中删除。如果是这样,请将其删除。
答案 10 :(得分:-1)
@Override
public void onBackPressed(){
finish();
super.onBackPressed();
}
这将解决您的问题。 finish()将破坏您的子活动,super.onBackPressed()会将您重定向到父活动。
答案 11 :(得分:-1)
您需要替换
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
}
}
}