SharedPreferences EditText dialog squashed on HTC WildFire

别等时光非礼了梦想. 提交于 2019-12-06 08:46:38

I know this answer most likely comes too late, but in case anyone else is looking for a solution to this truly annoying problem, this is how I worked around it, trying to keep it as vanilla as possible (to me, custom layouts were a definite no-no in this case):

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);
        }
    }
}

Using this code, the on-screen keyboard will be displayed on top of the dialog's buttons, but the EditText remains visible.

Two suggestions: 1) the easier way which may or may not give you enough room as it looks like your keyboard is taller than the standard android one: Hide the application title bar and the android status bar in the preference activity. This will move the dialogbox up a little.

@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) the harder way would be to write your own custom preference control by extending DialogPreference or EditTextPreference and define your own layout for that control that has a smaller or no title, or perhaps smaller ok/cancel buttons or something. then put that custom control in your preferences.xml

After a few different tries following code worked well (dialog with edit box is not so nice but it is functional). EditTextPreference should be customized (resource file with preferences should be changed also). CustomTextPreference should have trivial 3 constructors.

public class CustomEditTextPreference extends 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
}

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!