View切换之后setOnEditorActionListener就失效了

pamgu 2017-02-14 08:19:34
诸位好。首先祝回帖的各位情人节愉快、明年情人节更愉快!
我在 activiey_main 里用 setOnEditorActionListener 给输入框设定了监听事件,并且用 setContentView() 切到R.layout.s4,而在 R.layout.s4 中有可以通过 onBack3() 再 setContentView,回到R.layout.activity_main来。

测试中发现:从 layout.s4 回到 layout.activity_main 之后,监听事件就失灵了,无法再切到 s4 了。我也曾经把 代码挪到 onStart() onResume()里面,效果不变。
测试平台是 魅蓝3s。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//下面这些代码也曾经挪到 onStart() 或者 onResume()里面,然并卵
masterPswd = (TextView)findViewById(R.id.editText);
masterPswd.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
setContentView(R.layout.s4);
return false;
}
});
}

@Override
protected void onResume(){
super.onResume();
}

public void onBack3(View view) {
setContentView(R.layout.activity_main);
}
}


...全文
206 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jscoolstar 2017-02-14
这种情况,你最好是把两个view写到一个Framelayout/relativelayout中,然后控制隐藏消失。如果非要使用setcontentview,其实你可以先用inflatelayout.from(this).inflate先得到两个view,然后使用setcontentview(VIew v)这个重载方法,而不是用setcontentview(int layoutid)
回复
jscoolstar 2017-02-14
然后,虽然我看不了源码,但是setContentView(R.layout.activity_main)这个方法我觉得,它十有八九是用layoutinflate来将你的layoutId转成view,然后set的。所以你重新执行setContentView,虽然传入的是同一个layoutid,但其实是新的view,所以你原来findviewbyid的那些控件应该都是原来view的子控件,你setcontentview之后,必须重新findviewbyid 去给控件赋值,然后再加监听。(如果不重新findviewbyid赋值,直接加监听,其实还是加在了原来的已经不用的view的子view上)
回复
jscoolstar 2017-02-14
引用 2 楼 pamgu 的回复:
[quote=引用 1 楼 ganshenml 的回复:] 从 layout.s4 回到 layout.activity_main 之后,监听事件就失灵了,无法再切到 s4 了 —————————————————————————— 此时你的布局文件已经变成了s4,那么相应的组件及监听事件要重新初始化
我也是这样想的,所以我尝试在 onResume 里初始化,但是没效果,我想是因为 onResume 是 activity 一级的,布局文件的改变不会触发它。 那么,我应该在哪里重新初始化呢?[/quote] 你的理解是对的,你只是重新调用了setcontentview,这只是个方法,不会触发ativity的生命周期。你可以把初始化的部分写在setContentView(R.layout.activity_main);之后就可以了
回复
ganshenml 2017-02-14
引用 2 楼 pamgu 的回复:
[quote=引用 1 楼 ganshenml 的回复:] 从 layout.s4 回到 layout.activity_main 之后,监听事件就失灵了,无法再切到 s4 了 —————————————————————————— 此时你的布局文件已经变成了s4,那么相应的组件及监听事件要重新初始化
我也是这样想的,所以我尝试在 onResume 里初始化,但是没效果,我想是因为 onResume 是 activity 一级的,布局文件的改变不会触发它。 那么,我应该在哪里重新初始化呢?[/quote] 如果想改变布局,那么就通过布局本身来实现。比如用FrameLayout的Hidden 与Visible来实现你的目的
回复
pamgu 2017-02-14
引用 1 楼 ganshenml 的回复:
从 layout.s4 回到 layout.activity_main 之后,监听事件就失灵了,无法再切到 s4 了 —————————————————————————— 此时你的布局文件已经变成了s4,那么相应的组件及监听事件要重新初始化
我也是这样想的,所以我尝试在 onResume 里初始化,但是没效果,我想是因为 onResume 是 activity 一级的,布局文件的改变不会触发它。 那么,我应该在哪里重新初始化呢?
回复
ganshenml 2017-02-14
从 layout.s4 回到 layout.activity_main 之后,监听事件就失灵了,无法再切到 s4 了 —————————————————————————— 此时你的布局文件已经变成了s4,那么相应的组件及监听事件要重新初始化
回复
相关推荐
发帖
Android
创建于2009-10-09

7.8w+

社区成员

移动平台 Android
申请成为版主
帖子事件
创建了帖子
2017-02-14 08:19
社区公告
暂无公告