【发布时间】:2014-02-14 11:23:32
【问题描述】:
我还是 Android 编程新手,所以这个问题比较基础。我在 Internet 上看到很多代码示例,其中 UI 组件(例如 TextView)在 Activity 的 onCreate() 方法中被初始化和访问。
当我使用 Android Studio 创建一个新项目 - FirstApp - 使用默认设置时,一个名为 MainActivity 的空白 Activity 以及 activity_main 和 fragment_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!”。 - 我的简单问题有两个...
- 如果项目使用 Fragments,那么我是否应该完全期望 UI 组件无法在 Activity 的
onCreate()方法中访问,正如我在 Internet 上看到的大量示例代码所发生的那样,可能是因为它们还没有被创建了吗? - 我是否可以在 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