use*_*402 20 android android-layout
我有一个EditText电话myTextview.我希望软键盘在我点击时显示,EditText但如果我点击外面则解雇EditText.所以我使用下面的方法.但是当我在视图外面点击时键盘不会被忽略(我点击了一下TextView).我该如何修复此代码?
myTextview.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
} else {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myTextview.getWindowToken(), 0);
}
}
});
Run Code Online (Sandbox Code Playgroud)
Fel*_*shi 52
我找到了更好的解决方案:
覆盖dispatchTouchEventActivity中的方法.
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View v = getCurrentFocus();
if (v != null &&
(ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
v instanceof EditText &&
!v.getClass().getName().startsWith("android.webkit.")) {
int scrcoords[] = new int[2];
v.getLocationOnScreen(scrcoords);
float x = ev.getRawX() + v.getLeft() - scrcoords[0];
float y = ev.getRawY() + v.getTop() - scrcoords[1];
if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
hideKeyboard(this);
}
return super.dispatchTouchEvent(ev);
}
public static void hideKeyboard(Activity activity) {
if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
}
}
Run Code Online (Sandbox Code Playgroud)
即使您正在使用webview,这也适用.
pat*_*pat 16
也许有点容易:
在编辑文本上设置focusChangedListener,然后在没有焦点时隐藏键盘.
yourEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
hideKeyboard();
}
}
});
private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);
}
Run Code Online (Sandbox Code Playgroud)
这样,只有当您触摸可以获得焦点的视图时,键盘才会消失。我建议您执行以下操作:
像这样创建一个自定义 ViewGroup:
public class TouchLayout extends LinearLayout {
private OnInterceptTouchEventListener mListener;
public TouchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if(mListener != null) {
return mListener.onInterceptTouchEvent(event);
}
return super.onInterceptTouchEvent(event);
}
public void setOnInterceptTouchEventListener(OnInterceptTouchEventListener listener) {
mListener = listener;
}
public interface OnInterceptTouchEventListener {
public boolean onInterceptTouchEvent(MotionEvent event);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将自定义视图添加为 xml 布局的根:
<com.example.TouchLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)
在您的 Activity 中您应该执行以下操作:
final TouchLayout root = (TouchLayout) findViewById(R.id.root);
final EditText text = (EditText) findViewById(R.id.text);
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
root.setOnInterceptTouchEventListener(new OnInterceptTouchEventListener() {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final View v = getCurrentFocus();
if(v != null && v.equals(text)) {
final int screenCords[] = new int[2];
text.getLocationOnScreen(screenCords);
final Rect textRect = new Rect(screenCords[0], screenCords[1], screenCords[0] + text.getWidth(), screenCords[1] + text.getHeight());
if(!textRect.contains(event.getRawX(), event.getRawY() {
imm.hideSoftInputFromWindow(myTextview.getWindowToken(), 0);
// Optionally you can also do the following:
text.setCursorVisible(false);
text.clearFocus();
}
}
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37211 次 |
| 最近记录: |