我正在以标准方式在我的Android应用中使用SharedPreferences。在HTC WildFire设备上(分辨率240x320),当显示虚拟键盘时,EditText会被压缩。
有没有其他人遇到这个有解决方案?我已经被困了好几天了。
我的代码/ XML非常简单:
public class PrefsActivity extends PreferenceActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// don't display hidden preferences
getPreferenceScreen().removePreference(findPreference("hidden_prefs"));
}
}
我的偏好.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="User Preferences">
<EditTextPreference
android:key="profile"
android:title="Profile"
android:summary="Your profile name"
android:name="Profile"/>
<EditTextPreference
android:key="password"
android:title="Password"
android:summary="Your password"
android:name="Password"
android:password="true"/>
<EditTextPreference
android:name="Server"
android:summary="The server to use"
android:title="Server"
android:key="server"/>
<EditTextPreference
android:name="Secret"
android:summary="The server secret"
android:title="Secret"
android:password="true"
android:key="secret"/>
<CheckBoxPreference
android:title="On Demand"
android:defaultValue="true"
android:summary="Check to enable On Demand"
android:key="on_demand"/>
<ListPreference
android:title="Date"
android:summary="Set the type of date used"
android:key="date"
android:defaultValue="next"
android:entries="@array/prefs_date_keys"
android:entryValues="@array/prefs_date_values" />
</PreferenceCategory>
<PreferenceCategory android:key="hidden_prefs" android:title="Hidden Preferences">
<EditTextPreference
android:name="Last Project ID"
android:summary="The last Project ID"
android:title="Last Project ID"
android:key="last_project_id"
android:inputType="number"/>
<EditTextPreference
android:name="Fast Sync"
android:summary="Use Fast Sync"
android:title="Fast Sync"
android:key="fast_sync"
android:inputType="number"/>
</PreferenceCategory>
答案 0 :(得分:2)
我知道这个答案很可能来得太晚,但是如果其他人正在寻找解决这个真正烦人的问题的解决方案,这就是我如何解决这个问题,试图尽可能保持它的香草(对我来说,定制)布局在这种情况下肯定是禁止的):
public class MyEditTextPreference extends EditTextPreference
{
public MyEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void showDialog(Bundle bundle) {
super.showDialog(bundle);
Dialog dialog = getDialog();
if(dialog != null) {
Window window = dialog.getWindow();
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE |
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
}
}
使用此代码,屏幕键盘将显示在对话框的按钮顶部,但EditText
仍然可见。
答案 1 :(得分:1)
两个建议: 1)更简单的方式可能会或可能不会给你足够的空间,因为它看起来你的键盘比标准的android更高:隐藏应用程序标题栏和偏好活动中的android状态栏。这会将对话框向上移动一点。
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
2)更难的方法是通过扩展DialogPreference或EditTextPreference编写自己的自定义首选项控件,并为该控件定义自己的布局,该控件具有较小或没有标题,或者可能较小的ok / cancel按钮等。然后将该自定义控件放在您的preferences.xml
中答案 2 :(得分:1)
经过几次不同尝试后,代码运行良好(带编辑框的对话框不太好但功能正常)。应自定义EditTextPreference(还应更改具有首选项的资源文件)。 CustomTextPreference应该有简单的3个构造函数。
公共类CustomEditTextPreference扩展了EditTextPreference { ...
@Override
protected void showDialog(Bundle state)
{
super.showDialog(state);
// solving problem with insufficient space for showing EditText in EditTextPreference's dialog. This problem exists only
// on HTC WildFire with android OS 2.2
if ( Build.MODEL.equals("HTC Wildfire") && 8 == Integer.valueOf(android.os.Build.VERSION.SDK) )
{
_makeMoreRoomForEditText();
}
}
private void _makeMoreRoomForEditText()
{
EditText editText = getEditText();
View parent1 = (View) editText.getParent();
View parent2 = (View) parent1.getParent();
View parent3 = (View) parent2.getParent();
View parent4 = (View) parent3.getParent();
View parent5 = (View) parent4.getParent();
editText.setPadding(editText.getPaddingLeft(), 0, editText.getPaddingRight(), 0);
parent1.setPadding(parent1.getPaddingLeft(), 0, parent1.getPaddingRight(), 0);
parent3.setPadding(parent1.getPaddingLeft(), 0, parent1.getPaddingRight(), 0);
parent5.setPadding(parent5.getPaddingLeft(), 0, parent5.getPaddingRight(), 0);
ViewGroup par5 = (ViewGroup) parent5;
View v = par5.getChildAt(0);
v.setPadding(v.getPaddingLeft(), 3, v.getPaddingRight(), 3);// empirically determined values - looks fine only on HTC WildFire device with 2.2 Android
}
}