从嵌套类引用TextView对象

时间:2012-11-23 18:00:45

标签: android

我是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>

3 个答案:

答案 0 :(得分: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文件)的原因!否则,您将搜索空的视图层次结构

答案 1 :(得分:1)

您必须将onCreate方法更改为:

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

在为您的Activty执行setContentView后,您必须引用您的观点。

答案 2 :(得分:0)

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

检查出来:http://www.jayway.com/2009/03/26/layout-resources-in-android/