7

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

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

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

    @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 组件的启动代码移动到onStart()Activity 的方法中来解决这个问题,如下所示:

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

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

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

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

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

4

2 回答 2

7

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

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

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

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

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

于 2014-02-14T11:42:55.297 回答
0

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

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

于 2016-03-31T20:34:30.240 回答