Android - 活动onCreate和Fragment onCreate

时间:2014-02-14 11:23:33

标签: android android-fragments oncreate onstart

我还是Android编程新手,所以这个问题很基础。我在互联网上看到了许多代码示例,其中的UI组件(如TextView)正在初始化并在活动的onCreate()方法中进行访问。

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

如果我为TextView提供textview1的ID,并创建成员变量TextView myTextView;,那么我可以在活动的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!");
    }

这将导致左上方显示“Hello平板电脑!”的单个TextView的APK工作正常。 - 我的简单问题是双重的......

  1. 如果项目使用Fragments,那么我是否应该完全期望无法在Activity的onCreate()方法中访问UI组件,因为我看到在Internet上发现了大量示例代码,可能是因为他们已经尚未创建?
  2. 我可以在活动的onStart()方法(工作)中访问UI组件 - 或者我应该做些什么?以前我也使用了Fragment的onCreateView方法,但实际上是在片段的onCreate()方法中访问片段中的UI组件的最佳位置,我还没有尝试过?
  3. 我还注意到默认Fragment Android Studio的onCreate()方法在您创建新项目时为您创建的没有提供存根...但是onCreateView会这样做,以及生命周期文档暗示(对我来说,无论如何)这个可能是做这样事情的最佳场所。

    对此有任何指导意见。

2 个答案:

答案 0 :(得分:7)

fragment transaction commit命令只将事务置于Que中 - 事务将在未来的某个时间处理。这就是为什么你不能直接在创建时使用它。

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

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

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

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

答案 1 :(得分:0)

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

但如果您需要,可以在提交交易后致电FarmentManager.executePendingTransactions()。这可确保片段队列上的操作同步执行。 我有时在非UI的retainInstance片段中使用它。