你使用onPostCreate()方法吗?

时间:2011-10-01 16:04:08

标签: android

根据文件,

  

活动启动完成时调用(在onStart()和之后调用   onRestoreInstanceState(Bundle)已被调用)。申请将   一般不实施这种方法;它适用于系统类   在应用程序代码运行后进行最终初始化。

     

派生类必须调用超类的实现   这种方法。如果他们不这样做,将抛出异常。

不建议使用此方法。但是,我用它来调整onCreate之后的一些元素。我看到有些人用它来做onResume()之间的事情,建议他们不要这样做,因为他们不能依赖这种方法(由于文档不好)。

那么,我可以在这里使用调整(根本不依赖onResume)吗? 你有没有使用过这种方法?何时/为什么?

10 个答案:

答案 0 :(得分:51)

如果您使用您的所有活动应共享的功能制作自己的“超级”活动扩展名,则

onPostCreate非常有用。

使用onPostCreate作为子类'onCreate的回调方法将通知所有创建都已完成。 示例:如果您有共享相同布局的活动,则可以使用onPostCreate添加onClickListeners等

如果你要覆盖onPostCreate,最好在实现结束时调用super.onPostCreate。

答案 1 :(得分:15)

Google在他们的导航抽屉示例项目中使用 onPostCreate()。 ActionBarDrawerToggle需要在方向更改后同步,然后说:)

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

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

所以我认为 onPostCreate()只能在某些特定情况下使用...

答案 2 :(得分:13)

正如文档所述,onPostCreate主要用于框架使用。问题是:你打算在onPostCreate()中做什么,你不能在onCreate()或onResume()中做什么(即“调整一些元素”究竟是什么意思)?

我没有使用它,因为我认为没有理由这样做 - 我需要做的就是在onCreate或onResume上完成。但是谷歌本身就使用它TabActivity

答案 3 :(得分:10)

这是对第二个答案的扩展:

想象一下,您正在尝试实现BaseActivity,它不会在OnCreate方法中设置任何布局。

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

然后想象你有一些其他的Activity(扩展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是制作优秀应用的常用做法!

答案 4 :(得分:1)

当我需要以编程方式更改视图时,我使用onPostCreate()。我在findViewById()中使用时呼叫onCreate无效。

答案 5 :(得分:1)

您可能需要使用它。 特别是新的API。

可能有用的场景是轮换更改期间,或将状态返回到操作栏内有进度条的活动。 您需要在其onPostCreate()

中将其设置为false
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
        super.onPostCreate(savedInstanceState);
        setProgressBarIndeterminateVisibility(false);
}

答案 6 :(得分:0)

由于没有一个答案在onRestoreInstanceState(Bundle)上提出了一个观点,我想在此提出一点意见。将调用此方法,如果强行从内存中删除应用程序,然后再由用户启动。这样我们就可以使用这种方法来保留活动状态,如果用户以前从内存中强行删除了应用程序,则使用Incase。

答案 7 :(得分:0)

根据事件名称'Post'的含义,我总是用它来检查元素大小可能会在onCreated期间被更改,尤其是在屏幕旋转后应该更改元素或布局。

答案 8 :(得分:0)

您可以在ActivityThread#performLaunchActivity中检查执行顺序。然后,您会发现onPostCreate()是活动onCreate(),onStart(),OnRestoreInstanceState()之后执行的最终生命周期方法。然后,onResume将被执行。

答案 9 :(得分:-1)

它刚刚在onCreate之后调用,因为我的程序不是很复杂,所以效果很好。 在子类扩展其布局

之后,在基类中做一些共同的事情是很有用的