概述
注:本篇文章为笔者的学习笔记,其中有概念错误在所难免,欢迎指正。笔者的文章的内容是自己通过实践、思考得出的,而是不是道听途说来的,所以文章会含有大量来自于笔者思考的赘述,急于寻求解决方案的读者可以只看高亮的部分。笔者提供的问题解决方案在当前版本的编程环境下一般是有效的。
为了方便,笔者以Android Studio作为示例,实际上在这方面AS和Java是一样的(AS可以用Java语言编写)
Button button=new Button(this);//以MainActivity作为button的Context(上下文)
//Java代码用Button button=new Button("");即可
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//写被点击后执行的操作
}
});
上面的代码就是是创建按钮和并创建button对象的按键监听事件(使用匿名内部类的方法)的基本方法。
有时候我们需要在匿名内部类的外面(button.setOnClickListener的上方)声明一个变量(作为全局变量),然后在onClick方法中引用该变量,如下图所示。
这时会出现错误提示,大概就是说你在内部类中引用的变量需要被声明为final常量。这时你只需要在定义num变量的"int num=0;"前面加上"final"的修饰符即可。(在AS中可以选中错误部分,用ALT+ENTER快捷键快速增加final修饰符)
这时候你会发现一个问题,既然num被声明为final常量了,那它的值就无法修改了啊,我就无法实现每点一下按钮让num+1(修改num),然后按另一个按钮时显示这个按钮被按了几次的功能啊!没错,这种方法是走不通的,但是你能想到的功能前人一定都实现过,我们需要绕个弯子,用其他的方法实现这个功能。
处理这个问题的方法是我自己在一次实践中偶然发现的。我在外部声明了一个button(按钮)和一个textview(文本框),然后再button的OnClick方法中引用了匿名内部类外面声明的textview对象。果不其然,它又要我将textview声明为final常量,但是我突然发现可以用textview对象的setText方法修改文本框内的值,而且不会报错。那么只需把num的值存储在textview中,通过匿名内部类内声明的局部变量修改num的值,再写回textview中就好了啊!
后来我渐渐发现了更好的方法。
事实上,匿名内部类内只是不能修改外部声明的对象的值(可以理解为对象的物理地址,用"System.out.println(对象名)"看到的东西),但是可以修改对象的属性。
我可以声明一个含有int属性的类,如下面代码:
public class SaveNum {
public int num;
}
然后通过下面的代码储存num的值:
Button button=new Button(this);//以MainActivity作为button的Context(上下文)
//Java代码用Button button=new Button("");即可
SaveNum saveNum=new SaveNum();//初始化一个savenum对象
saveNum.num=0;
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
saveNum.num=1;//正确
//saveNum=new SaveNum();//错误,修改了外部对象的值
}
});
最佳解决方案:
由于匿名内部类内不能修改对象的值,但是可以修改对象的属性,可以用下面的方法来实现数据在匿名内部类的内外传递的功能。
public class Test extends Activity {
private int num=0;//声明可以在匿名内部类中修改的变量
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button=new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num=1;
}
});
}
}
这段代码在运行时不会出问题。
开始我认为在类中声明相当于C++中的全局变量,而在方法中声明为局部变量,前者可以在匿名内部类中修改而后者不可。
后来我发现这样的理解有点问题,实际上应该是这样的:
上面num变量的声明方式为类的属性的声明方式,而Java在编译类时将生成一个类的实例,即对象。所以在匿名内部类中相当于修改了本类的一个属性,因此可以修改。
但是我发现了一个问题,按上面红字的理解方式,num应该可以用this.num的方式调用。但是实践发现,在匿名内部类内不能这样,或者说,匿名内部类中不能使用this指针。
这一块问题还有待研究!
最后
以上就是多情小海豚为你收集整理的[Java&Android Studio]如何将数据在匿名类(onClick方法)的内外传递(解决Variable...within inner class,needs declared final)最佳解决方案:的全部内容,希望文章能够帮你解决[Java&Android Studio]如何将数据在匿名类(onClick方法)的内外传递(解决Variable...within inner class,needs declared final)最佳解决方案:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复