【问题标题】:Android - Activity onCreate and Fragment onCreateAndroid - Activity onCreate 和 Fragment onCreate
【发布时间】:2014-02-14 11:23:32
【问题描述】:

我还是 Android 编程新手,所以这个问题比较基础。我在 Internet 上看到很多代码示例,其中 UI 组件(例如 TextView)在 Activity 的 onCreate() 方法中被初始化和访问。

当我使用 Android Studio 创建一个新项目 - FirstApp - 使用默认设置时,一个名为 MainActivity 的空白 Activity 以及 activity_mainfragment_main,我可以立即将其编译成一个 APK,将它部署在我的设备上,我会看到一个带有标题“FirstApp”的屏幕,左上角的 TextView 显示“Hello world!”。

如果我给TextView 一个ID 为textview1,并创建一个成员变量TextView myTextView;,那么我可以在Activity 的onCreate() 方法中引用它,就像这样(没有编译器错误,当然):

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        myTextView = (TextView) findViewById (R.id.textview1);
        myTextView.setText ("Hello tablet!");

        if (savedInstanceState == null)
        {
            getSupportFragmentManager().beginTransaction().add (R.id.container,new PlaceholderFragment()).commit();
        }
    }

但是,如果我编译并运行 APK,则会导致“不幸的是,FirstApp 已停止”。消息。

我之前通过将访问 UI 组件的启动代码移动到 Activity 的 onStart() 方法中解决了这个问题,如下所示:

    @Override
    protected void onStart()
    {
        super.onStart();
        myTextView = (TextView) findViewById (R.id.textview1);
        myTextView.setText ("Hello tablet!");
    }

这会导致 APK 的左上角有一个 TextView 显示“Hello tablet!”。 - 我的简单问题有两个...

  1. 如果项目使用 Fragments,那么我是否应该完全期望 UI 组件无法在 Activity 的 onCreate() 方法中访问,正如我在 Internet 上看到的大量示例代码所发生的那样,可能是因为它们还没有被创建了吗?
  2. 我是否可以在 Activity 的 onStart() 方法中访问 UI 组件(确实工作) - 还是我应该做其他事情?之前我也用过 Fragment 的onCreateView 方法,但实际上是在 Fragment 的onCreate() 方法中访问Fragment 内的UI 组件的最佳位置,我还没有尝试过?

我还注意到,当您创建一个新项目时,Android Studio 为您创建的默认 Fragment 的 onCreate() 方法没有提供存根......但 onCreateView 提供,并且生命周期文档暗示(对我来说,无论如何)这可能是做这种事情的最佳场所。

对此的任何指导表示赞赏。

【问题讨论】:

  • 当它崩溃时,获取 Logcat Stacktrace 以便我们可以看到错误所在。 myTextView 是否也在其他地方设置,即TextView myTextView;
  • 您应该阅读有关片段的一般信息。 1. 片段的视图在那里尚不可用(它不是您添加到布局中的简单视图) 2. 您可以从所需的回调访问视图(通常首选onCreate())。问题是您尝试访问应该避免的片段视图,而是让片段自行处理。
  • @Tom Hart - 是的,TextView myTextView; 包含在成员变量中。您的回复是否暗示您认为这个 UI 组件应该在 Activity 本身的 onCreate() 方法中完全可访问?

标签: android android-fragments oncreate onstart


【解决方案1】:

片段事务提交命令仅将事务放入 Que - 该事务将在未来的某个时间处理。这就是为什么您不能从创建时直接使用它的原因。

我建议您使用片段来封装它们的 Ui 行为 - 我不会从活动中显式更改片段的 Ui 元素。

片段内的 OnCreateView 是初始化片段的 Ui 元素的好地方,因为它在片段视图创建时被调用。

刚开始使用片段非常棘手和痛苦,但根据我的经验,它们确实有助于创建更加模块化的代码。

我建议您在开始认真的项目之前阅读文档中有关片段的更多信息。 http://developer.android.com/guide/components/fragments.html

【讨论】:

  • 谢谢...是的,在 onCreateView 方法期间访问片段中的 UI 组件确实工作正常,只要我使用 rootView.findViewById - 我发现我不明白我什至如何尝试在片段的onCreate 方法中访问 UI 组件,因为我似乎无法访问 container,这显然是传递给 onCreateView并且可用于inflate 方法。
  • P.S. - 如果我只是补充说我没有完全选择使用 Fragments 本身可以吗,我选择使用 Android Studio 并且似乎 Android Studio 想要尝试并 enforce(鼓励)使用 Fragments,在您创建新项目时提供一个。这不是坏事......我只需要正确地了解事情,因为您在互联网上看到的许多代码示例似乎没有使用片段,因此我遇到了简单事情的问题。谢谢!
  • Android Studio 的新版本现在允许您创建一个新项目没有默认片段,对于我正在创建的应用程序来说,这似乎是一件好事我,所以它让事情变得更简单了。
【解决方案2】:

@chipopo 在诊断和封装建议中是正确的。

但如果您需要,您可以在提交事务后调用FarmentManager.executePendingTransactions()。这确保了对碎片队列的操作是同步执行的。 我有时在非 UI 的保留实例片段中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多