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

时间:2016-03-23 01:09:44

标签: android android-layout android-intent android-studio android-manifest

在从子活动按下后退按钮时,父活动会显示一秒钟并自行刷新。

在子活动中,我在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);
}

}

12 个答案:

答案 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>块。

我建议您阅读managing the activity lifecycletasks and back stack

答案 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
       }
    }
}