为什么在onCreate()中编写代码会使我的android程序崩溃,但是在onCreateOptionsMenu()中相同的代码可以正常工作?

时间:2014-05-14 21:04:46

标签: java android xml eclipse

这是一个非常简单的代码来替换默认的" Hello World!"通过创建新的Android项目生成的文本。我已经包含了我的.xml中的T​​extView标记和MainActivity.java中的代码段。我注意到创建一个新的Android项目会创建另一个名为" appcompat"没有它注意到所有的工作。有没有办法让这个代码从onCreate()运行?也许摆脱appcompat。

我注意到,在代码从onCreate()成功运行的朋友计算机上,有一个.xml文件; " activity_main"我在哪里,并没有提到appcompat。

我在rMBP,Eclipse Kepler,最新的Java和Android SDK上运行OSX Mountain Lion,基本上所有内容都是最新的。

fragment_main.xml中的T​​extView标记

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:id="@+id/label1" />

MainActivity.java文件的代码片段......

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Program crashes with code here ...
    // TextView tv = (TextView) findViewById(R.id.label1);
    // tv.setText("I've replaced the label!");


    if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // ... This works fine
    TextView tv = (TextView) findViewById(R.id.label1);
    tv.setText("I've replaced the label!");

        // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

2 个答案:

答案 0 :(得分:2)

你的TextView包含在你的片段中,在此之前不会膨胀:

getSupportFragmentManager().beginTransaction()
        .add(R.id.container, new PlaceholderFragment()).commit();

线

如果您要使用片段,那么您应该将触及UI的代码放在Fragment类中(在您的情况下,这是PlaceholderFragment.java

答案 1 :(得分:2)

创建片段布局并将其附加到活动视图层次结构的挂起片段事务在活动onStart()中执行。之后调用onCreateOptionsMenu()。片段事务执行之前的任何事情都太早了。

请注意onCreate()中的交易代码只发布交易,但尚未执行。

此外,从设计的角度来看,请考虑不要在活动中对片段内部进行依赖。让片段处理它的视图。