Android - 소프트 키보드를 프로그래밍 방식으로 숨기기/표시
우선 이 실타래는 이미 봤어요.나는 거기서 인정받는 방법을 시도해 보았지만, 아무 것도 효과가 없었다.
내 앱에는 두 개의 화면이 있다.
- 첫 번째는 2개의 EditText - 하나는 사용자 이름용, 다른 하나는 비밀번호용
- 두 번째는 1개의 ListView와 EditText를 사용하여 목록을 필터링합니다.View
첫 화면에서 사용자 이름 EditText가 부팅에 초점을 맞추고 키보드가 표시되도록 합니다.이것은 나의 실장입니다(불필요한 코드나 관련 없는 코드를 삭제함으로써 간단하게 할 수 있습니다.
#app_parames.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를 누를 때만 표시되도록 합니다.
내 문제는 두 경우 모두 정반대의 결과를 얻는다는 것이다.누군가 전에 이 문제를 겪었기를 바란다.그나저나 나는 시뮬레이터와 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가 제공합니다.사실 그는 전에 본 적이 없는 다른 SOF 스레드에 링크했습니다.하지만 재미있는 것은 이 솔루션이 처음에 언급했던 스레드로 제공된다는 것입니다.그리고 나는 그것을 시도하지 않았다 왜냐하면 그것은 다른 모든 게시물들이 많은 표를 가지고 있는 줄에서 0표를 가지고 있었기 때문이다.어리석음의 극치.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
저는 두 번째 솔루션이 깔끔해 보였기 때문에 그대로 하기로 했습니다.하지만 첫 번째 것은 확실히 효과가 있다.또한 @Dyarish의 답변에는 EditText 아래의 ScrollView를 사용하여 EditText에 초점을 맞추는 영리한 해킹이 포함되어 있습니다.하지만 해보진 않았지만, 효과가 있을 거예요.깔끔하진 않지만.
2. 액티비티 시작 시 키보드를 숨기려면
@Dyarish가 제공하는 답변은 딱 하나였습니다.솔루션은 집중 가능한 것을 사용하는 것입니다.EditTexts를 포함하는 레이아웃에 대한 XML의 TouchMode 설정.이것으로 성공했습니다.
<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의 답을 사용하게 된다.그래서 나는 그에게 현상금을 수여한다.나를 도와주려고 했던 다른 모든 친구들에게 감사한다.
업데이트 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
}
나는 열심히 노력했고 해결책을 찾아냈다...새로운 액티비티가 시작될 때마다 키보드가 열리지 않습니다만, Runnable을 onResume로 사용할 수 있고 정상적으로 동작하고 있으므로 이 코드를 사용하여 확인해 주십시오.
업데이트 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);
show keyboard
imm.showSoftInput(ed, 0);
EditText에 초점을 맞춥니다.
ed.requestFocus();
여기서 ed는 EditText 입니다.
을 코드에 합니다.★★★★★★★★★★★android:focusableInTouchMode="true"
에서는, 기동시에 편집 텍스트 박스의 키패드가 표시되지 않게 됩니다.편집텍스트 상자를 포함하는 선형 레이아웃에 이 줄을 추가하려고 합니다.두 가지 문제를 모두 해결하려면 이것을 가지고 놀 수 있어야 합니다.나는 이것을 시험해 보았다.심플한 솔루션
즉, 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>
---------------------------------------------------------------------------------------------------------------------
이는 부팅 시 사용자 이름 편집 텍스트 상자에 키보드가 나타나도록 하기 위함입니다.제가 한 일은 빈 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>
보다 설득력 있는 솔루션을 찾고 있다면 이 질문을 통해 도움이 될 수 있습니다. 위의 솔루션만큼 간단하지는 않지만 더 나은 솔루션이 될 수 있습니다.테스트해 본 적은 없지만 효과가 있는 것 같아요.하지만 그것은 당신이 시도했지만 당신에게 효과가 없었던 해결책과 비슷하다고 생각합니다.
이것이 당신이 찾고 있는 것이기를 바랍니다.
건배!
이 코드를 사용해 보세요.
소프트키보드를 표시하는 경우:
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}
소프트 키보드를 숨기는 경우 -
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/android-programmatically-hide-show-soft-keyboard
'programing' 카테고리의 다른 글
webpack vuejs를 통해 이메일 보내기 (0) | 2022.06.21 |
---|---|
Java에서 HashMap 객체와 Map 객체의 차이점은 무엇입니까? (0) | 2022.06.21 |
드래그 가능한 Vuetify 확장 패널 (0) | 2022.06.21 |
정렬을 수행하기 위한 C 라이브러리 함수 (0) | 2022.06.21 |
오류: IntelliJ IDE에서 기본 클래스를 찾거나 로드할 수 없습니다. (0) | 2022.06.21 |