繁体   English   中英

从一个活动按下后退按钮可刷新堆栈中的上一个活动

[英]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)再次启动时,它将经历正常的生命周期 - 它将恢复并且所有保存的实例状态都将恢复。 由于您尚未发布它,因此您需要确保onResumeonRestart在父活动中没有做任何事情 ,例如加载或设置数据。

如果你确实保留了你编写的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 activityonBackPressed()更改为此,或者也可以从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM