Възможен дубликат:
Как се затваря/скрива софтуерната клавиатура на Android програмно?
Първо, вече видях тази тема. Опитах приетите методи, дадени там, но нищо не ми помогна.
Имам два екрана в приложението си.
- Първият има 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
И моят проблем е, че получавам точно обратното и в двата случая. Надяваме се, че някой се е сблъсквал с този проблем преди. Между другото, тествам на симулатора и телефона 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 тема, която не съм виждал преди. Но най-смешното е, че това решение е дадено в темата, която посочих в началото. И не съм го пробвал, защото имаше нула гласа в тема, където всички останали публикации имат много гласове. Върхът на глупостта.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
За мен второто решение изглеждаше добре, така че реших да се придържам към него. Но първото със сигурност работи. Също така, отговорът на @Dyarish съдържа умен хак за използване на ScrollView под EditText, за да даде на EditText фокуса. Но не съм го пробвал, но трябва да работи. Не е спретнато обаче.
2. За да скриете клавиатурата при започване на дейноста
Само един отговор работи за мен, който е предоставен от @Dyarish. И решението е да се използват настройките на focusableInTouchMode в XML за оформлението, съдържащо EditTexts. Това свърши работа
<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 и в двата случая. Така че присъждам наградата на него. Благодаря на всички други мои приятели, които се опитаха да ми помогнат.