프로그래밍 방식으로 Android 소프트 키보드 숨기기 / 표시
가능한 중복 :
Android Soft Keyboard 닫기 / 숨기기
우선 먼저 나는 이미 보았다 이 스레드를. 나는 거기에 주어진 방법을 시도했다. 그러나 아무것도 나를 위해 일하지 않았다.
앱에 두 개의 화면이 있습니다.
- 첫 번째는 2 개의 EditText를 가지고 있습니다-하나는 사용자 이름과 하나는 암호
- 두 번째는 하나의 ListView와 EditText를 가지며 listView를 필터링합니다.
첫 번째 화면에서 사용자 이름 EditText가 시작에 중점을두기를 원하고 키보드가 표시되어야합니다. 이것은 구현입니다 (불필요하거나 관련없는 코드를 제거하여 단순화 됨).
app_login.xml
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip">
<EditText android:id="@+id/username"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:hint="Username"
android:imeOptions="actionDone" android:inputType="text"
android:maxLines="1"/>
<EditText android:id="@+id/password"
android:password="true"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Password" />
</LinearLayout>
AppLogin.java
class AppLogin extends Activity{
private EditText mUserNameEdit = null;
private EditText mPasswordEdit = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.app_login);
mUserNameEdit = (EditText) findViewById(R.id.username);
mPasswordEdit = (EditText) findViewById(R.id.password);
/* code to show keyboard on startup.this code is not working.*/
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}//End of onCreate()
}
글쎄, 시작할 때 키보드가 표시되지 않습니다 . 그리고 내 디자인에는 키보드가 심하게 필요합니다.
이제 두 번째 페이지로 .. 나는 이미 listView와 EditText가 있다고 말했습니다. 사용자가 editText를 터치 할 때만 키보드가 숨겨 지기를 원합니다. 믿을 수 있습니까? 액티비티를로드 할 때 소프트 키보드를 사용 하려고하면 무엇이든 표시됩니다 . 숨길 수 없습니다.
app_list_view.xml
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
AppList.java
public class MyListActivity extends ListActivity{
private EditText mfilterEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_list_view);
mFilterEditText = (EditText) findViewById(R.id.filter_edittext);
InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0);
}
}
단순화
- 로그인 페이지 (첫 페이지)에서 키보드를 시작할 때 보이기를 원합니다.
- SecondPage에서 키보드를 먼저 숨기고 사용자가 editText를 터치 할 때만 나타나기를 원합니다.
그리고 내 문제는 두 경우에 정확히 반대되는 것입니다 ... 누군가 가이 문제에 직면하기를 바랍니다 .BTW 시뮬레이터와 HTC Desire 전화에서 테스트하고 있습니다.
최종 결과
글쎄, 나는 모든 친구들의 도움으로 여기에서 일했다.
1. 시작시 키보드 표시
두 가지 대답이 나를 위해 일했습니다. @CapDroid에서 제공하는 것으로, 핸들러를 사용하여 지연 게시하는 것입니다.
mUserNameEdit.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(mUserNameEdit, 0);
}
},50);
두 번째 답변은 @Dyarish가 제공합니다. 실제로 그는 이전에 보지 못한 다른 SO 스레드에 연결되었습니다. 그러나 재미있는 점은이 솔루션이 처음에 참조 한 스레드에서 제공된다는 것입니다. 그리고 다른 모든 게시물에 많은 투표권이있는 스레드에서 투표가 0이기 때문에 시도하지 않았습니다 .. 어리 석음의 높이 ..
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
나에게 두 번째 해결책은 깔끔해 보였으므로 그것을 고수하기로 결정했다. 그러나 첫 번째 해결책은 확실히 작동한다. 또한 @Dyarish의 답변에는 EditText 아래에 ScrollView를 사용하여 EditText에 포커스를주는 영리한 해킹이 포함되어 있습니다.하지만 시도하지는 않았지만 작동해야합니다. 깔끔하지는 않지만 ..
2. 활동 시작시 키보드를 숨기려면
@Dyarish가 제공하는 답변은 하나뿐입니다. 그리고 해결책은 editText를 포함하는 레이아웃에 xml에서 focusableInTouchMode 설정을 사용하는 것입니다. 이 트릭을했다
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusableInTouchMode="true">
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
어쨌든, 나는 두 경우 모두 Dyarish의 대답을 사용하게됩니다. 그래서 나는 그에게 현상금을 수여하고 있습니다. 나를 도와 주려는 다른 모든 친구들에게 감사합니다 ..
이것을 코드에 추가하면 android:focusableInTouchMode="true"편집 텍스트 상자를 시작할 때 키패드가 나타나지 않습니다. 이 줄을 EditTextBox가 포함 된 선형 레이아웃에 추가하려고합니다. 이 문제를 해결하기 위해이 문제를 해결할 수 있어야합니다. 나는 이것을 테스트했다. 간단한 해결책.
즉 : app_list_view.xml 파일에서
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusableInTouchMode="true">
<EditText
android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search"
android:inputType="text"
android:maxLines="1"/>
<ListView
android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
------------------ 편집 : 시작시 키보드를 표시하려면 -----------------------
이것은 키보드를 시작할 때 사용자 이름 edittextbox에 키보드가 나타나도록하기위한 것입니다. 내가 한 모든 것은 빈 Scrollview를 .xml 파일의 맨 아래에 추가하면 첫 번째 편집 텍스트가 포커스되고 키보드가 나타납니다. 나는 이것이 해킹이라는 것을 인정하지만, 이것이 당신이 작동하기를 원한다고 가정합니다. 나는 그것을 테스트했고 잘 작동한다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip">
<EditText
android:id="@+id/userName"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Username"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1"
/>
<EditText
android:id="@+id/password"
android:password="true"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Password" />
<ScrollView
android:id="@+id/ScrollView01"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
</ScrollView>
</LinearLayout>
더 웅변적인 솔루션을 찾고 있다면 이 질문을 통해 도움이 될 수 있습니다. 위의 솔루션만큼 간단하지는 않지만 더 나은 솔루션 일 것입니다. 나는 그것을 테스트하지 않았지만 분명히 작동합니다. 나는 그것이 당신에게 시도하지 않은 솔루션과 유사하다고 생각합니다.
이것이 당신이 찾고있는 것이기를 바랍니다.
건배!
업데이트 2
@Override
protected void onResume() {
super.onResume();
mUserNameEdit.requestFocus();
mUserNameEdit.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
InputMethodManager keyboard = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(mUserNameEdit, 0);
}
},200); //use 300 to make it run when coming back from lock screen
}
나는 매우 열심히 시도하고 해결책을 찾았습니다 ... 새로운 활동이 시작될 때마다 키보드를 열 수 없지만 onResume 에서 Runnable 을 사용할 수 있으며 정상적으로 작동 하므로이 코드를 시도하고 확인하십시오 ...
업데이트 1
이 줄을 당신의 AppLogin.java
mUserNameEdit.requestFocus();
이 라인은 AppList.java
listview.requestFocus()'
이 후에 응용 프로그램이 작동하지 않는지 확인한 다음 AndroidManifest.xml파일 에이 줄을 추가 하십시오
<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>
원래 답변
InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
키보드 숨기기
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);
쇼 키보드
imm.showSoftInput(ed, 0);
EditText에 중점을 둡니다.
ed.requestFocus();
ed는 EditText입니다.
이 코드를 사용해보십시오.
소프트 키보드 표시 :
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}
SoftKeyboard 숨기기-
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
InputMethodManager.SHOW_IMPLICIT첫 번째 창에서 시도 했습니까?
두 번째 창 사용에 숨어 InputMethodManager.HIDE_IMPLICIT_ONLY
편집 :
여전히 작동하지 않으면 잘못된 위치에 넣었을 것입니다. 무시 onFinishInflate()하고 표시 / 숨 깁니다.
@override
public void onFinishInflate() {
/* code to show keyboard on startup */
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}
참고 URL : https://stackoverflow.com/questions/7200281/programmatically-hide-show-android-soft-keyboard
'development' 카테고리의 다른 글
| application / x-javascript와 text / javascript 컨텐츠 유형의 차이점 (0) | 2020.04.15 |
|---|---|
| 내 시험판 응용 프로그램은 iTunes Connect에서 일주일 이상“처리 중”이었습니다. (0) | 2020.04.15 |
| 쿠키는 HTTP 프로토콜에서 어떻게 전달됩니까? (0) | 2020.04.15 |
| 포커스를받을 수있는 HTML 요소는 무엇입니까? (0) | 2020.04.15 |
| 타입 안전이란 무엇입니까? (0) | 2020.04.15 |