Android 导航抽屉打开时如何关闭键盘?
我已将导航抽屉添加到我的应用程序中。到目前为止,其他一切工作正常,但我有一个问题,当导航抽屉打开时,键盘没有关闭。导航抽屉是主要活动,然后从抽屉打开的每个页面都是一个片段 我已尝试将以下内容添加到片段中的每个EditText区域。然而,这并不是结束任何事情Android 导航抽屉打开时如何关闭键盘?,android,android-fragments,slidingdrawer,Android,Android Fragments,Slidingdrawer,我已将导航抽屉添加到我的应用程序中。到目前为止,其他一切工作正常,但我有一个问题,当导航抽屉打开时,键盘没有关闭。导航抽屉是主要活动,然后从抽屉打开的每个页面都是一个片段 我已尝试将以下内容添加到片段中的每个EditText区域。然而,这并不是结束任何事情 InputMethodManager imm1 = (InputMethodManager)getActivity().getSystemService( Context.INPUT_METHOD_SERVICE);
InputMethodManager imm1 = (InputMethodManager)getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm1.hideSoftInputFromWindow(input1.getWindowToken(), 0);
我也尝试过将代码放在主活动中,但也没有成功。关于我可以采取哪些不同的措施来实现这一点,您有什么想法吗?在您的抽屉布局中添加一个。然后,您可以使用上面的代码关闭onDrawerOpened()方法中的键盘试试这段代码,我会在我的应用程序中使用它,例如,如果我打开一个包含编辑文本的对话框 我在create中设置了这段代码。希望这有帮助
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入\状态\始终\隐藏)代码>这对我来说非常有效:
private ActionBarDrawerToggle aDrawerToggle;
private DrawerLayout aDrawerLayout;
创建类后,我将在空白处使用此代码:
aDrawerToggle = new ActionBarDrawerToggle(getActivity(),
aDrawerLayout,
R.drawable.main_icon,
R.string.drawer_open,
R.string.drawer_close){
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
InputMethodManager inputMethodManager = (InputMethodManager)getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
//inputSearch is my EditText
inputMethodManager.hideSoftInputFromWindow(inputSearch.getWindowToken(), 0);
getActivity().supportInvalidateOptionsMenu();
}
}
要在打开或关闭导航抽屉时隐藏打开的键盘,请覆盖onDrawerListner
中的方法onDrawerSlide
,并添加以下行
InputMethodManager inputMethodManager = (InputMethodManager) actionBarActivity
.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
actionBarActivity.getCurrentFocus().getWindowToken(),
0
);
//如果滑块打开,请不要执行任何操作
}
其他的
{
如果(查看EditText的实例){
视图w=getCurrentFocus();
int scrcoords[]=新int[2];
w、 getLocationOnScreen(scrcoords);
float x=ev.getRawX()+w.getLeft()-scrcoords[0];
float y=ev.getRawY()+w.getTop()-scrcoords[1]
if (ev.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom())) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
}
}
return ret;
}
if(ev.getAction()==MotionEvent.ACTION_UP&&(x=w.getRight()| | yw.getBottom()){
InputMethodManager imm=(InputMethodManager)getSystemService(Context.INPUT\u方法\u服务);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(),0);
}
}
返回ret;
}
在onCreate中:
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.
INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
});
因为,drawer.setDrawerListener(toggle)不推荐使用。使用drawer.addDrawerListener(切换),如下所述
私有void initDrawerLayout(){
谢谢你的回答,我很感谢你花时间。我已经试着自己设置了这个,但我不了解具体的实现。你能给我一个代码片段说明应该如何做吗?我的搜索到目前为止还没有结果。我一直在使用谷歌版本的抽屉。你在使用支持库的抽屉布局吗?如果您可以这样做,只需在xml文件中为DroperLayout指定一个id,然后通过使用“DroperLayout mDrawerLayout=(DroperLayout)findViewById(R.id.MyDroperLayout);”在活动中获取DroperLayout的实例。然后您可以这样实现它:mDrawerLayout.setDroperLayout(new DroperListener(){…//重写这里的方法…});是的,我正在使用支持库中的抽屉布局。但是,我显然有我的“Dunce”上限,因为每次我尝试实现您提到的代码时都会出错。findViewById已设置为抽屉布局id,因此我尝试设置新的侦听器,也就是在出现错误时,我在新侦听器上也会出错(表示new是无效类型).我想这只是我做错了什么,但如果我现在能弄清楚的话,那就糟了。谢谢你的帮助。好的。终于把抽屉式速记器设置好了,没有任何错误。:D但是在隐藏键盘方面仍然有问题。我的主要活动中没有任何edittext字段,只有片段有。所以我不能说“(EditText.getWindowToken,0);。删除EditText部分后,会出现一个错误,显示getWindowToken未定义。:/只需写“MyActivity activity=(MyActivity)getActivity;”,然后写“activity.setTheEditText(someEditText)”“那么你的活动就会知道编辑文本谢谢你的回答,我感谢你花时间回答。当我将它添加到我的应用程序时,这对我没有任何帮助,所以我假设我做错了什么。使用此选项时,片段视图将失去焦点,然后焦点将在片段第一个可聚焦视图中,有没有办法避免另一个问题是在onDrawerSlide
方法调用中,这个随机显示的视图(在我的例子中,是提交功能的按钮)将出现在屏幕上,就像使用android:windowSoftInputMode=“adjustResize”一样“
这就是我最终能够工作的原因。谢谢。当然,请将此代码添加到onCreate方法中,并且无论何时滑动以打开抽屉/抽屉打开时,键盘也会隐藏,请不要忘记在onCreate中声明工具栏。对于我来说,它足以覆盖onDrawerOpened()
。
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.
INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
});
final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
InputMethodManager inputMethodManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
InputMethodManager inputMethodManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
};
drawer.setDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle
(this, drawer, toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close)
{
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
InputMethodManager inputMethodManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
InputMethodManager inputMethodManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
};
drawer.addDrawerListener(toggle);
toggle.syncState();
drawer.closeDrawer(GravityCompat.START);
}