Android开发报错:Cannot resolve symbol 'listner' 如何解决?
嘿,这个错误我太熟了!你遇到的Cannot resolve symbol 'listner'问题,主要是两个原因导致的,咱们一步步来搞定:
核心问题分析
- 变量声明顺序搞反了:你现在的代码里,先调用了
btnSearch.setOnClickListener(listener);,但listener这个变量是在这行之后才定义的。Java是静态编译语言,必须先把变量声明/初始化好,才能拿来用,不然编译器根本不知道你说的listener是什么。 - 拼写小失误:错误提示里的
listner比正确的listener少了一个字母e——如果你的实际代码里手滑把listener写成了listner,也会触发这个错误(不过看你贴的代码是对的,大概率是顺序问题)。
修正方案
方案1:调整声明顺序(最直接的改法)
把listener的定义挪到setOnClickListener调用之前,让编译器先认识这个变量:
public class MainMenu extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_menu); // 先定义点击事件监听器 View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), Search.class); startActivity(intent); } }; Button btnSearch = (Button) findViewById(R.id.btnSearch); btnSearch.setOnClickListener(listener); } }
方案2:用匿名内部类直接传入(更简洁)
其实没必要单独声明listener变量,直接把匿名内部类作为参数传进去,既省代码又避免顺序问题:
public class MainMenu extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_menu); Button btnSearch = (Button) findViewById(R.id.btnSearch); btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), Search.class); startActivity(intent); } }); } }
方案3:Lambda表达式简化(Android Studio 3.0+可用)
如果你的开发环境支持Java 8+,还可以用lambda把代码缩得更短,可读性也不差:
public class MainMenu extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_menu); Button btnSearch = (Button) findViewById(R.id.btnSearch); btnSearch.setOnClickListener(v -> { Intent intent = new Intent(getApplicationContext(), Search.class); startActivity(intent); }); } }
随便选一种改法,你的错误应该就解决了~
内容的提问来源于stack exchange,提问作者Yousef1111
相关产品推荐
相关产品推荐

