如何调用Android的onBackPressed()方法而不在MainActivity中显式调用?

时间:2016-08-12 23:16:23

标签: java android inheritance

调用onBackPressed()方法,而不必在onBackPressed();方法中编写onCreate()。我知道这个方法有效,因为当我将它注释掉时,它的效果被删除(即使调用了其他活动,也会从MainActivity中退出程序)。

另外,如果我将onBackPressed();输入到MainActivity中,那么它将无效。我真的很困惑为什么onBackPressed()方法无法调用方法。对不起,如果我没有正确地说出问题,我希望我做到了!并提前感谢!!

public class MainActivity extends ActionBarActivity{

private Button button;
private Button button2;
private ImageView im;
private ImageView im2;
private boolean doubleBackToExitPressedOnce = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

 }
@Override
public void onBackPressed(){
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

public void changeColor() {
    button = (Button) findViewById(R.id.button);
    im = (ImageView) findViewById(R.id.imageView2);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            im.setBackgroundColor(Color.rgb(255,255,255));
        }
    });
  }
 }

3 个答案:

答案 0 :(得分:2)

在方法声明上方看到那个小@Override注释?这是跟踪超类中继承的方法的便捷方法。这意味着MainActivity的超类Activity也有一个名为OnBackPressed()的方法。

现在,根据面向对象编程设计,所有活动所共有的行为和属性,在{{1}中实现(或至少定义) }类。由于您可以在任何活动中按后退按钮,因此该方法抽象Activity类。 Android操作系统会为您调用此方法,因此每次按下后退按钮时您都不必自己操作。难道不是很好吗?基本上,您可以让两个类从Activity继承onBackPressed(),但让它们执行不同的代码。这称为polymorphism

有关继承here的更多信息。

答案 1 :(得分:1)

  

调用onBackPressed()方法而不必编写onBackPressed();在onCreate()方法中。

第一部分......

From the docs

  

当活动检测到用户按下后退键时调用。默认实现只是完成当前活动,但您可以覆盖它以执行任何操作。

所以这是的简单版本"为什么"当你自己不实现它时它仍会运行。

第二部分...... 我不确定你为什么要在onCreate()

中调用它
  

另外,如果我输入onBackPressed();进入MainActivity,然后它将无法正常工作。

它将如何编程使其工作。

你有......

@Override
public void onBackPressed(){
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

所以你没有调用它的super方法,这就是为什么它没有像你期望的那样关闭。

要解决此问题,请调用方法

@Override
public void onBackPressed(){
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    super.onBackPressed(); // add this here

}

Some further Java reading

答案 2 :(得分:0)

一个简单直接的答案:

阅读此行说的内容

public class MainActivity extends ActionBarActivity{

您的主要活动扩展了ActionBarActivity。

每当一个类扩展另一个类时,它都会继承父类中的所有内容(在这种情况下,ActionBarActivity是您的父类)。

如果按下控件并单击ActionBarActivity,它将进入该类,您可以看到其中实现的方法。如果你继续上升,你会发现onBackPressed()是在层次结构的某个地方实现的。

因此,默认情况下,当您扩展活动时,Activity类正在实现onBackPressed()。您可以通过覆盖它来更改此函数的行为:

@Override 
OnBackPressed() {...}

要了解有关继承和覆盖的更多信息,我建议您阅读:

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html