1

我是 Android 编程的新手,可能我还不太了解 Java,所以我的程序遇到了这个问题。每次我按下菜单上的按钮时,我都会得到java.lang.NullPointerException单击菜单上的item2时,是否有任何方法可以引用此 TextView 对象并更改其文本?

public class MainActivity extends Activity {

TextView tv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MainActivity.this.tv = (TextView) findViewById(R.id.tekst1);
    setContentView(R.layout.activity_main);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.mymenu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.item2) {
        MainActivity.this.tv.setText("aaa");
    }
    return super.onOptionsItemSelected(item);
}
}

编辑:mymenu xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/item1"
    android:icon="@android:drawable/ic_menu_week"
    android:title="Option 1"/>
<item
    android:id="@+id/item2"
    android:icon="@android:drawable/ic_menu_month"
    android:title="Option 2"/>

</menu>

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/tekst1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world"
    tools:context=".MainActivity" />
</RelativeLayout>
4

3 回答 3

2

您需要在检索元素之前加载布局。

只需更换

MainActivity.this.tv = (TextView) findViewById(R.id.tekst1);
setContentView(R.layout.activity_main);

经过

setContentView(R.layout.activity_main);
MainActivity.this.tv = (TextView) findViewById(R.id.tekst1);

findViewById 方法尝试在视图的层次结构中找到一个元素(从一个 ID)。这就是为什么您需要先加载这个层次结构(从 XML 文件)!否则,您将在空的视图层次结构中搜索

于 2012-11-23T18:09:02.513 回答
1

您必须将onCreate方法更改为:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MainActivity.this.tv = (TextView) findViewById(R.id.tekst1);
}

setContentView在为您的 Activty 做完之后,您必须参考您的观点。

于 2012-11-23T18:10:16.587 回答
0

通过使用 setContentView(int layoutResId) 方法,android 平台正在创建您的布局 xml 文件中包含的所有视图对象,并提供给 setContentView(int layoutResId) 方法。这意味着在调用 setContentView(int layoutResId) 方法之前,findViewById(int resId) 方法将为布局中的任何视图引用返回 null,从而导致一些潜在的 NullpointerExceptions。为了避免这些错误,将 setContentView(int layoutResId) 方法调用放在 onCreate() 方法的最顶部是一个好习惯。

看看这个:http ://www.jayway.com/2009/03/26/layout-resources-in-android/

于 2012-11-23T18:31:07.857 回答