将OptionsMenu的OnClickListener移至外部类时遇报错求助
嘿,把点击逻辑拆分到外部类来简化Activity代码的思路非常好,咱们来逐个解决你遇到的两个问题:
第一个错误:接口方法实现不规范
你写的public class OptionsMenu implements View.OnClickListener{本身没问题,但问题出在你实现的方法名上——你写的是onclick (View view)(小写的c),而View.OnClickListener接口要求的方法是onClick(View view)(大写的C)。Java是大小写敏感的语言,所以这个方法没有正确实现接口,导致编译报错。
第二个错误:PopupMenu需要Context参数
PopupMenu的构造方法第一个参数必须是Context类型的对象,而你的OptionsMenu是一个普通的自定义类,并不继承自Context(只有Activity、Application这类类才是Context的子类),所以OptionsMenu.this无法作为Context传入,这是第二个报错的原因。我们需要把Activity的Context传递到OptionsMenu类里。
修正后的OptionsMenu.java代码
import android.content.Context; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.ImageButton; import android.widget.PopupMenu; /** * Created on 2018-01-05. */ public class OptionsMenu implements View.OnClickListener{ private final Context mContext; private final WebView mWebView; private final ImageButton mOptionsMenuBtn; // 通过构造方法传入需要的Context、WebView和按钮 public OptionsMenu(Context context, WebView webView, ImageButton optionsMenuBtn) { this.mContext = context; this.mWebView = webView; this.mOptionsMenuBtn = optionsMenuBtn; } // 正确实现接口的onClick方法(大写C) @Override public void onClick(View view) { // 直接处理点击逻辑,无需重复给按钮设置监听 PopupMenu popup = new PopupMenu(mContext, mOptionsMenuBtn); popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.back: if (mWebView.canGoBack()) { mWebView.goBack(); } else { mWebView.reload(); } return true; case R.id.forward: if (mWebView.canGoForward()) { mWebView.goForward(); } else { mWebView.reload(); } return true; case R.id.refresh: mWebView.reload(); return true; // 补上遗漏的return,避免逻辑异常 default: return false; } } }); popup.show(); } }
修正后的Home.java中调用OptionsMenu的代码
在Home的onCreate方法里,替换原来的options_menu点击监听代码,改成这样:
// options button toolbar options_menu = (ImageButton) findViewById(R.id.options_menu); // 初始化外部的OptionsMenu类,传入必要的实例 OptionsMenu optionsMenuHandler = new OptionsMenu(Home.this, webView, options_menu); // 给按钮设置点击监听为外部类实例 options_menu.setOnClickListener(optionsMenuHandler);
额外小优化提示
- 我在OptionsMenu的构造方法里传入了所有需要的对象,避免了在外部类中重复执行
findViewById(你之前写的options_menu.findViewById(R.id.options_menu)是多余的,按钮已经在Home中初始化完成)。 - 补充了refresh分支遗漏的
return true;,避免逻辑分支出现异常。
这样修改后,两个报错就都解决了,而且成功把PopupMenu的点击逻辑从HomeActivity中拆分出来,后续你可以用同样的思路拆分更多逻辑类~
内容的提问来源于stack exchange,提问作者EquiWare
相关产品推荐
相关产品推荐

