单击或触摸另一个视图时清除EditText焦点并隐藏键盘
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单击或触摸另一个视图时清除EditText焦点并隐藏键盘相关的知识,希望对你有一定的参考价值。
我试图隐藏键盘和清除光标(也无法输入内容)。
我正在使用edittext,FrameLayout(它只是容器)和textView(具有clickListener)制作应用程序。当我在edittext中输入内容然后触摸或单击其他视图时,我想隐藏键盘(显示)并清晰地关注edittext(显示光标)。
这是我的代码。
main A磁体vi同意.Java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
RelativeLayout mainLayout;
EditText editText;
FrameLayout container;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.editText);
editText.setFocusableInTouchMode(true);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
Log.d("onFocusChange", "b #" + b);
// i can only get true, i can't get false value. how can i get false value.
// i want to use this method so hard!
}
});
textView = (TextView)findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// hide Keyboard and editText's focus will be false(also cursor is going to hide).
}
});
container = (FrameLayout)findViewById(R.id.container);
container.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// hide Keyboard and editText's focus will be false(also cursor is going to hide).
return true;
}
});
}
}
和
activity_main.xml(这只是具有EditText,frameLayout和TextView的简单布局)
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:focusable="true"
android:focusableInTouchMode="true" >
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/container"
android:background="@android:color/holo_blue_bright"
android:layout_above="@+id/textView"
android:layout_below="@+id/editText"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<TextView
android:id="@+id/textView"
android:gravity="center"
android:layout_alignParentBottom="true"
android:text="textView : layout_alignParentBottom = true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
最后一件事,AndroidManifest.xml
我只是插入代码:<activity ... android:windowSoftInputMode="adjustResize"> ... </activity>
答案
在final
添加editText = (EditText)findViewById(R.id.editText);
试试这个
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
});
要么
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}
});
我希望这对你有所帮助
另一答案
你必须得到editText的onFocusChange
代码可以是这样的。
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v.getId() == R.id.editText && !hasFocus) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
});
即使您使用片段滑动,此代码也会起作用。(对于片段,将mContext更改为getActivity());
以上是关于单击或触摸另一个视图时清除EditText焦点并隐藏键盘的主要内容,如果未能解决你的问题,请参考以下文章
在焦点侦听器中更改复合可绘制时,EditText会无限地触发焦点更改事件
ViewPager 内的 Fragment 中的 EditText 焦点上的视图混淆了