2011-10-01 71 views
20

根據該文件,你使用onPostCreate()方法嗎?

當活動啓動完成後調用(之後在onStart()和 onRestoreInstanceState(包)已被調用)。應用程序將 一般不執行此方法;它旨在系統類 在應用程序代碼運行後進行最終初始化。

派生類必須調用這個方法的超類的實現 。如果他們不這樣做,就會拋出異常。

建議不要使用此方法。但是,我使用它來調整onCreate後的某些元素。我發現有些人用它來做onResume()之間的事情,他們不建議這樣做,因爲他們不能依靠這種方法(由於其不好的文檔)。

那麼,我可以在這裏使用調整(它完全不依賴於onResume)嗎?
你曾經使用過這種方法嗎?何時/爲什麼?

+1

我真的是唯一一個使用此方法嗎? – sandalone

回答

12

正如文檔所述,onPostCreate主要用於框架使用。問題是:你打算在onCostate()中做什麼,你不能在onCreate()或onResume()中做什麼(即什麼「調整一些元素」的意思)?

我沒有使用它,因爲我沒有理由這樣做 - 我需要做的所有事情都可以在onCreate或onResume中完成。不過谷歌自己在它的TabActivity中使用它。

+0

你是對的。爲什麼在使用onStart或onResume時使用它。謝謝 – sandalone

+0

很高興我可以幫助:) – AgentKnopf

+0

我必須用它來避免非法使用情況。我在appcompatactivity中使用FragmentTabHost,當我在onCreate中初始化FragmentTabhost並在活動加載完成之前按主頁按鈕時,它會引發錯誤。 – WonderSoftwares

42

如果您正在使用您的活動的「超級」擴展和所有活動應共享的功能,onPostCreate會非常有用。

使用onPostCreate作爲子類的回調方法'onCreate將通知所有創建完成。 例如:如果您有活動共享相同的佈局,那麼你可以使用onPostCreate添加onClickListeners等

如果您正在覆蓋onPostCreate,最好是撥打電話在您的實現年底super.onPostCreate。

+1

這就是我如何將它與butterknife結合使用以注入我所有的視圖,這非常有用。 – bclymer

+0

如果在重寫onCreate方法中調用''super.onCreate()'',然後附加偵聽器呢?從http://developer.android.com/reference/android/app/Activity.html#onPostCreate(android.os.Bundle): 應用程序通常不會實現此方法;它旨在讓系統類在應用程序代碼運行後進行最終初始化。 –

+0

最好的解釋。 ...謝謝@ user1419056 – Kushal

14

Google在其導航抽屜的示例項目中使用onPostCreate()。 ActionBarDrawerToggle需要同步後的方向變化可以說:)

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 

    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

所以我覺得onPostCreate()應該只在某些特定情況下使用...

1

我用onPostCreate()當我需要改變以編程方式查看。因爲當我在onCreate中使用時,致電findViewById()不起作用。

+1

我簡單地想評論一下:既然鼓勵使用Fragments來佈局你的UI,你可以簡單地使用Fragment的onViewCreated方法來更新你的後期創建。或者,你甚至可以在創建視圖上進行 - 視圖實際上是創建/膨脹的。 – AgentKnopf

1

可能有些情況需要使用它。 專門用於較新的API。

可能有用的場景是在輪換更改期間,或將狀態返回到在操作欄內具有進度條的活動。 你需要設置虛假裏面onPostCreate()

@Override 
protected void onPostCreate(Bundle savedInstanceState) 
{ 
     super.onPostCreate(savedInstanceState); 
     setProgressBarIndeterminateVisibility(false); 
} 
0

由於沒有一個答案對onRestoreInstanceState(捆綁)做了一個點,我想做出點這裏。這個方法將被調用,如果一個應用程序被強制從內存中刪除,然後再由用戶啓動。這樣我們就可以使用此方法來保留活動狀態,如果用戶以前從內存中強制刪除應用程序,則爲Incase。

0

根據事件名稱'Post'的含義,我總是使用它來檢查元素的大小可能會在onCreated期間發生變化,特別是在元素或佈局應該在屏幕旋轉後更改時。

7

這是一個擴展的第二個答案:

想象一下,你正在努力實現BaseActivity不設置在onCreate方法的任何佈局。

public abstract class BaseActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
    } 
} 

然後想象你有一些其他的活動(擴展BaseActivity),其中規定了一些佈局:

public class MainActivity extends BaseActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

activity_main.xml中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<Button 
    android:id="@+id/my_btn" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 

所以在第一次當你可以在BaseActivity中使用您的按鈕onPostCreate方法:

public abstract class BaseActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     Button btn = (Button) findViewById(R.id.myBtn); //this is the when you can initialise your button 

    } 

} 

使用BaseActivity是製作優秀應用程序的常見做法!

0

它只是在onCreate之後調用,由於我的程序不是非常複雜,所以效果很好。 在子類擴展其佈局後,在基類中執行一些共同的操作是有用的