我是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>
答案 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/