【问题标题】:Do you use onPostCreate() method?你使用 onPostCreate() 方法吗?
【发布时间】:2011-10-01 16:04:07
【问题描述】:

根据文档,

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

派生类必须调用超类的实现 这种方法。否则,将引发异常。

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

那么,我可以在这里使用调整吗(它根本不依赖onResume)?
您是否曾经使用过这种方法以及何时/为什么?

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您正在制作自己的 Activity 的“超类”扩展,并且所有 Activity 都应共享功能,那么 onPostCreate 会很有用。

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

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

    【讨论】:

    • 这就是我如何结合使用它与butterknife来注入我所有的观点,它非常有用。
    • 在重写的 onCreate 方法中调用 super.onCreate() 然后附加监听器怎么样?来自developer.android.com/reference/android/app/…:应用程序一般不会实现这个方法;它旨在让系统类在应用程序代码运行后进行最终初始化。
    【解决方案2】:

    Google 在他们的 Navigation Drawer 示例项目中使用 onPostCreate()。 ActionBarDrawerToggle 需要在方向改变后同步让我们说:)

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
    
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }
    

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

    【讨论】:

      【解决方案3】:

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

      我没有使用它,因为我认为没有理由这样做 - 我需要做的所有事情都可以在 onCreate 或 onResume 中完成。然而,谷歌本身在 TabActivity 中使用它。

      【讨论】:

      • 你是对的。为什么在我可以使用 onStart 或 onResume 时使用它。谢谢
      • 我必须使用它来避免 Illegalstateexception。我在 appcompatactivity 中使用 FragmentTabHost,当我在 onCreate 中初始化 FragmentTabhost 并在活动加载完成之前按主页按钮时,它会引发错误。
      【解决方案4】:

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

      想象一下,您正在尝试实现 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 是制作优秀应用的常见做法!

      【讨论】:

        【解决方案5】:

        当我需要以编程方式更改视图时,我使用onPostCreate()。因为当我在onCreate 中使用时,调用findViewById() 不起作用。

        【讨论】:

        • 我想简短地评论一下:由于我们鼓励您使用 Fragments 来布置您的 UI,您可以简单地使用 Fragment 的 onViewCreated 方法来更新您的后期创作。或者,您甚至可以在 onCreateView 上执行 - 实际创建/膨胀视图的位置。
        【解决方案6】:

        在某些情况下您可能需要使用它。 特别是使用较新的 API。

        它可能有用的场景是在旋转更改期间,或将状态返回到在操作栏中具有进度条的活动。 您需要将其设置为 false onPostCreate()

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            由于没有一个答案对 onRestoreInstanceState(Bundle) 有任何意义,我想在此说明一点。如果应用程序被强制从内存中删除然后由用户再次启动,则将调用此方法。这样我们就可以使用这种方法来保留活动状态,以防用户之前从内存中强行删除了应用程序。

            【讨论】:

              【解决方案9】:

              根据事件名称“发布”的含义,我总是用它来检查元素大小可能在 onCreated 期间发生变化,尤其是在屏幕旋转后应该更改元素或布局时。

              【讨论】:

                【解决方案10】:

                它只是在 onCreate 之后调用,因为我的程序不是很复杂,所以它运行良好。 在子类扩展其布局后,在基类中做一些共同的事情是有用的

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-11-08
                  • 2011-09-19
                  • 2011-05-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-22
                  • 2018-10-08
                  相关资源
                  最近更新 更多