当我们有以下内容时:
final TextView view = (TextView) layout.findViewById(R.id.some_view);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
view.setText(“blah”);
}
}
//等
view
除非final
方法无法访问onClick
如果此代码段位于方法内,则会在堆栈上分配view
,并保留对堆的引用。因此,在方法结束时,调用view
将丢失。由于onClick
位于同一范围内,view
仍然可见。我的问题是:onClick
可以随时调用。将其标记为final
是否确保在侦听器运行时view
不为空?或者是否需要检查空值?那是为什么会这样呢?
答案 0 :(得分:0)
如果您的布局不包含R.id.some_view,则findViewById()可能会返回null。所以你可能需要检查是否为null。 检查null的位置取决于您的应用程序逻辑。匿名OnClickListener对象将创建内部"视图"复制,所以即使外观"查看"超出范围,听众仍然会参考"视图"变量。 在哪里检查null是你的选择,但是如果findViewById()返回null,那么你可能不应该创建单击一个监听器。
答案 1 :(得分:0)
我测试了你的最终代码
但是这个Textview不是空的。
也许布局没有textview
您必须检查textview您的布局。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R
.layout.activity_main);
Button button =(Button)findViewById(R.id.button);
final TextView view = (TextView)findViewById(R.id.some_view);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
view.setText("Hello world");
}
});
}