2011-05-22 5 views
2

J'utilise SharedPreferences dans mon application Android de manière standard. Sur l'appareil HTC WildFire (résolution 240x320), EditText est écrasé lorsque le clavier virtuel est affiché.SharedPreferences EditText boîte de dialogue écrasée sur HTC WildFire

Est-ce que quelqu'un d'autre est tombé sur cette solution? J'ai été perplexe pendant des jours.

My SharedPreferences activity on the HTC WildFire

Mon code/XML est assez simple:

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

Et mon preferences.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> 

Répondre

1

Deux suggestions: 1) la manière plus facile ce qui peut ou peut ne pas vous donner assez de place car il semble comme votre clavier est plus grand que le standard Android: Cacher la barre de titre de l'application et la barre d'état Android dans l'activité de préférence. Cela va déplacer légèrement la boîte de dialogue.

@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) la façon plus difficile serait d'écrire votre propre contrôle de préférence sur mesure en étendant DialogPreference ou EditTextPreference et définir votre propre mise en page pour ce contrôle qui a un plus petit ou pas de titre, ou peut-être plus petit ok/annuler les boutons ou quelque chose. Ensuite, mettez ce contrôle personnalisé dans vos préférences.xml

+0

Merci pour vos suggestions. Je ne veux pas casser l'apparence de l'application (en particulier pour les combinés autres que le HTC WildFire), donc je pense que je vais aller avec 2). Êtes-vous en mesure de fournir une référence sur la façon de le faire? Je pense que changer la taille de police du titre ou le remplissage sera la voie à suivre. –

2

Je sais que cette réponse vient très probablement trop tard, mais au cas où quelqu'un d'autre cherche une solution à ce problème vraiment ennuyeux, voici comment j'ai travaillé autour de lui, en essayant de garder la vanille que possible (pour moi, mises en page personnalisées sont un non-pas dans ce cas):

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

en utilisant ce code, le clavier à l'écran sera affiché au-dessus des boutons de la boîte de dialogue, mais le EditText reste visible.

1

Après quelques différents essais du code ci-dessous ont bien fonctionné (dialogue avec la boîte d'édition est pas si belle mais il est fonctionnel). EditTextPreference doit être personnalisé (le fichier de ressources avec les préférences doit également être modifié). CustomTextPreference devrait avoir 3 constructeurs triviaux.

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

}

Questions connexes