你使用onPostCreate()方法吗?

san*_*one 27 android

根据文件,

在活动启动完成时调用(在onStart()和onRestoreInstanceState(Bundle)之后调用).应用程序通常不会实现此方法; 它适用于系统类在应用程序代码运行后进行最终初始化.

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

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

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

小智 53

如果您使用您的所有活动应共享的功能创建自己的"超级"活动扩展,onPostCreate可能很有用.

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

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


lom*_*mza 17

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

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

    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}
Run Code Online (Sandbox Code Playgroud)

所以我认为onPostCreate()应该仅在某些特定情况下使用...


Age*_*opf 16

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

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


ale*_*sov 10

这是第二个答案的扩展:

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

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

然后想象你有一些其他的Activity(扩展BaseActivity),它设置了一些布局:

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

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>
Run Code Online (Sandbox Code Playgroud)

因此,第一次在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

    }

}
Run Code Online (Sandbox Code Playgroud)

使用BaseActivity是制作优秀应用程序的常见做法!