繁体   English   中英

Android - 活动onCreate和Fragment onCreate

[英]Android - Activity onCreate and Fragment onCreate

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

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

如果我给TextView一个textview1的ID,并创建一个成员变量, 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平板电脑!” - 我的简单问题是双重的......

  1. 如果项目使用Fragments,那么我是否应该完全期望在Activity的onCreate()方法中无法访问UI组件,因为我看到在Internet上发生了大量示例代码,可能是因为它们尚未创建?
  2. 我可以在Activity的onStart()方法中访问UI组件(这确实有用) - 或者我应该做些什么? 以前我也使用了Fragment的onCreateView方法,但实际上是在片段的onCreate()方法中访问片段内部的UI组件的最佳位置,我还没有尝试过?

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

对此有任何指导意见。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM