Как я могу вернуть свою полноэкранную клавиатуру Android?

У меня есть приложение, которое работает от android 1.5 до 4.0. Android 4.1 вызывает проблему с простым EditTextPreference. Приложение всегда находится в ландшафтном режиме. Когда я вызываю название команды, он выглядит следующим образом.

Pic 1 http://myweb.midco.net/hgs/s1.jpg

Затем, когда я нажимаю Редактировать текстовое поле, оно всегда выглядело следующим образом.

Pic 1 http://myweb.midco.net/hgs/s2.jpg

Но в моих эмуляторах и жалобе на Samsung Galaxy Tab 2 с Android 4.1 я получаю это.

Pic 1 http://myweb.midco.net/hgs/s3.jpg

Это разбивает текстовое поле. Изменение манифеста на

android:windowSoftInputMode="stateVisible|adjustResize"

или

android:windowSoftInputMode="stateVisible|adjustPan"

не помогло. Если оставить заголовок заголовка недействительным, он снимает заголовок, но вы все еще не видите текст редактирования. Вот код для этого Pref.

EditTextPreference teamnamePref = new EditTextPreference(this); 
teamnamePref.setTitle("Team Name"); 
teamnamePref.setKey( "t" + Team_ID );
teamnamePref.setSummary(TheTeamName); 
teamnamePref.setDialogTitle("Enter Name For Team " + Team_ID);
teamnamePref.setDefaultValue(TheTeamName);
teamnamePref.getEditText().setSingleLine(true);
TeamCategory.addPreference(teamnamePref);

Спасибо

2 ответа

Я создал метод обхода этой ошибки (протестирован на Samsung Galaxy S3, Acer A501 и HTC Desire X):

// This method provides a work-around for a bug with EditTextPreference and the Samsung soft keyboard.
// When in landscape mode, the Samsung keyboard can obscure the text box, as it does not use fullscreen 
// / extract mode like other keyboards do in this case. So we manually show an alert dialog with an
// EditText control, and update the preference value manually.
//
// Usage:
// Create a normal <preference> in your XML file, then in your corresponding fragment, retrieve the 
// preference object using its key and pass it to this method. E.g.
//
// EditTextPreferenceHelper.CreateEditTextPreferenceDialog(
// getActivity(), 
// findPreference("yourPrefKey"));
public static void CreateEditTextPreferenceDialog(final Context context, Preference preference) {
 preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
 @Override
 public boolean onPreferenceClick(final Preference preference) {
 AlertDialog.Builder builder = new AlertDialog.Builder(context);
 builder.setTitle(preference.getTitle());
 final EditText textBox = new EditText(context);
 textBox.setImeOptions(EditorInfo.IME_ACTION_DONE);
 textBox.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
 textBox.setText(PreferenceManager.getDefaultSharedPreferences(context).getString(preference.getKey(), ""));
 builder.setView(textBox);
 builder.setPositiveButton("OK", new OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 PreferenceManager.getDefaultSharedPreferences(
 context).edit().putString(preference.getKey(), 
 textBox.getText().toString()).commit();
 dialog.dismiss();
 }
 });
 builder.setNegativeButton("Cancel", new OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
 }
 });
 builder.create().show();
 return false;
 }
 }); 
}
</preference>


Что-то вроде этого должно выполнить эту работу. Вы всегда можете изменить флаг мягкого ввода на что-то другое, например adjustPan. Причина, по которой это не сработало раньше, - это то, что EditTextPreference переопределяет эти параметры.

import android.content.Context;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.view.Window;
import android.view.WindowManager;
public class CustomEditTextPref extends EditTextPreference
{
 public CustomEditTextPref(Context context)
 {
 super(context);
 }
 @Override
 protected void showDialog(Bundle state)
 {
 super.showDialog(state);
 Window window = getDialog().getWindow();
 window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
 }
}

licensed under cc by-sa 3.0 with attribution.