我还是Android编程新手,所以这个问题很基础。我在互联网上看到了许多代码示例,其中的UI组件(如TextView
)正在初始化并在活动的onCreate()
方法中进行访问。
当我使用Android Studio创建新项目时FirstApp
- 使用默认设置,一个名为MainActivity
的空白活动随身携带activity_main
和fragment_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工作正常。 - 我的简单问题是双重的......
onCreate()
方法中访问UI组件,因为我看到在Internet上发现了大量示例代码,可能是因为他们已经尚未创建?onStart()
方法(做工作)中访问UI组件 - 或者我应该做些什么?以前我也使用了Fragment的onCreateView
方法,但实际上是在片段的onCreate()
方法中访问片段中的UI组件的最佳位置,我还没有尝试过?我还注意到默认Fragment Android Studio的onCreate()
方法在您创建新项目时为您创建的没有提供存根...但是onCreateView
会这样做,以及生命周期文档暗示(对我来说,无论如何)这个可能是做这样事情的最佳场所。
对此有任何指导意见。
答案 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片段中使用它。