能否从继承LinearLayout的类中通过Intent启动Activity?
当然可以从继承LinearLayout的类中启动Activity!
你的代码问题出在Intent的上下文参数传递错误,还有一个容易忽略的Flag设置,我来给你修正和解释:
问题分析
你写的new Intent(this.MyKeyboard,Main2Activity.class)是错误的——首先this.MyKeyboard这种写法不对,其次LinearLayout是View的子类,它本身不是Context,但可以通过getContext()方法获取关联的上下文。另外,如果这个自定义LinearLayout不是在Activity内部直接使用(比如你的场景是自定义键盘),启动Activity时必须添加FLAG_ACTIVITY_NEW_TASK标记,否则会抛出异常。
修正后的代码
@Override public void onClick(View v) { if (inputConnection == null) return; if (v.getId() == R.id.replay) { // 获取当前上下文,创建Intent Intent intent = new Intent(getContext(), Main2Activity.class); // 非Activity上下文启动Activity必须添加这个Flag intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 用上下文启动Activity getContext().startActivity(intent); } if (v.getId() == R.id.button_delete) { CharSequence selectedText = inputConnection.getSelectedText(0); if (TextUtils.isEmpty(selectedText)) { inputConnection.deleteSurroundingText(1, 0); } else { inputConnection.commitText("", 1); } } }
关键注意点
- 上下文获取:永远用
getContext()来获取View关联的上下文,而不是直接用this——虽然在Activity里的View用this可能暂时有效,但在非Activity场景(比如键盘、弹窗)会直接报错,getContext()是通用且安全的写法。 - FLAG_ACTIVITY_NEW_TASK:当你的上下文不是Activity类型时(比如InputMethodService的上下文),必须添加这个标记,系统需要一个新的任务栈来承载启动的Activity。
- Manifest注册:别忘了在
AndroidManifest.xml里注册Main2Activity,这是最容易被忽略的启动失败原因:<activity android:name=".Main2Activity" />
内容的提问来源于stack exchange,提问作者AZER
相关产品推荐
相关产品推荐

