2016-08-12 38 views
0

onBackPressed()方法被調用時,我不得不在onCreate()方法內寫入onBackPressed();。我知道這個方法是有效的,因爲當我註釋掉它的時候,它的效果就被刪除了(即,即使其他活動被調用,也會從MainActivity中退出程序)。Android的onBackPressed()方法如何在未明確在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)); 
     } 
    }); 
    } 
} 
+0

onBackPressed被稱爲當用戶按下後面的鍵。這個調用是由框架完成的。 '我知道這個方法有效,因爲當我將它註釋掉時,它的效果就被刪除了(即,即使其他活動被調用,也會從MainActivity中退出程序)。另外,如果我輸入onBackPressed();進入MainActivity,那麼它將無法工作「完全不清楚。 – Kishore

+0

提供的所有答案都非常有意義。感謝你們!!! –

回答

2

看到上面的方法聲明的小注釋@Override?這是一種方便的方式來跟蹤從超類繼承10的方法。這意味着MainActivity的超類Activity也有一個名爲OnBackPressed()的方法。

現在,根據面向對象的編程設計,行爲和所共有所有活動,在Activity類被實現爲(或至少所定義的)的屬性。由於您可以在任何活動中按下後退按鈕,因此該方法是抽象爲Activity類。 Android操作系統會爲您調用此方法,因此每次按下後退按鈕時都不必親自操作。這不是很好嗎?所以基本上,你可以有兩個類從Activity繼承onBackPressed(),但讓他們執行不同的代碼。這被稱爲polymorphism

有關繼承的更多信息here

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

0

一個簡單而直接的答案:

閱讀下面這行說

public class MainActivity extends ActionBarActivity{

你主活動延伸法ionBarActivity。

每當一個類擴展另一個類時,它會繼承父類的所有內容(在這種情況下,ActionBarActivity就是您的父類)。

如果按下控件並單擊ActionBarActivity,它將帶您進入該類,您可以看到其中實現的方法。如果繼續向上,您會發現onBackPressed()在層次結構的某處實施。

因此,默認情況下,當您擴展活動時,活動類正在實施onBackPressed()。您可以通過重寫它改變這個函數的行爲,如:

@Override 
OnBackPressed() {...} 

要了解更多關於繼承和壓倒一切的,我建議你把這個讀:

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

相關問題