Disposition de clavier personnalisée Android laissant une marge de blanc sur le côté

Je travaille sur un clavier personnalisé pour Android, et je suis entré dans un problème où le clavier semble laisser une ligne / espace blanc à droite, au lieu de remplir la vue parentale … (ne craignez pas les icônes , C'est simplement un espace réservé pour le graphique)

Capture d'écran du simulateur

  • Compilation de la bibliothèque Android-OpenCV avec Cygwin
  • Comment accéder à la ressource avec un nom dynamique dans mon cas?
  • Rendu d'objet 3D dans openCV en utilisant metaio dans Android
  • Comment télécharger des fichiers depuis Android?
  • Comment faire pour que Alarm Manager fonctionne lorsque Android 6.0 est en mode Doze?
  • Comment utiliser signalr dans Android
  • Ci-dessous, vous pouvez voir ma mise en page …

    <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="14%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="60dp" > <Row> <Key android:codes="49" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="1%p" android:keyEdgeFlags="left"/> <Key android:codes="50" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="51" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="52" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="53" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="54" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="48" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="113" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="114" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="116" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="121" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="111" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="112" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/> </Row> <Row> <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="46" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/> <Key android:codes="58" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:keyEdgeFlags="right"/> </Row> <Row android:rowEdgeFlags="bottom"> <Key android:codes="44" android:keyIcon="@drawable/globe" android:horizontalGap="8%p" android:keyEdgeFlags="left"/> <Key android:codes="47" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="32" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/> <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="-5" android:keyIcon="@drawable/backspace" android:keyEdgeFlags="right"/> </Row> </Keyboard> 

    Pour autant que je puisse le voir, c'est une question de 1%p … Mais je suis un peu incertain comment le remplir sans gâcher mes alignements … Par exemple, changer l'écart dans la première ligne à 2 le réparerait, Mais gâchez l'alignement.

    Ajout de code supplémentaire pour vous comme demandé …

    Ma classe étendue InputMethodService :

      private KeyboardView kv; private Keyboard keyboard; @Override public View onCreateInputView() { kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null); keyboard = new Keyboard(this, R.xml.custom_keyboard); kv.setPreviewEnabled(false); kv.setKeyboard(keyboard); kv.setOnKeyboardActionListener(this); return kv; } @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { InputConnection ic = getCurrentInputConnection(); if (primaryCode == Keyboard.KEYCODE_DELETE) { ic.deleteSurroundingText(1, 0); } else { Drawable mDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.rsz_emoji, null); Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap(); String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Emoticon", null); Uri fileUri = Uri.parse(path); Intent picMessageIntent = new Intent(Intent.ACTION_SEND); picMessageIntent.setPackage("com.android.mms"); picMessageIntent.putExtra(Intent.EXTRA_STREAM, fileUri); picMessageIntent.setType("image/png"); picMessageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(picMessageIntent); } } @Override public void onText(CharSequence text) { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeDown() { } @Override public void swipeUp() { } 

    My Keyboard.xml

     <?xml version="1.0" encoding="utf-8"?> <android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" /> 

    Styles.xml

     <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources> 

    Manifeste:

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="CENSORED" > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- Declares the input method service --> <service android:name=".CENSORED" android:label="@string/keyboard_name" android:permission="android.permission.BIND_INPUT_METHOD"> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> <meta-data android:name="android.view.im" android:resource="@xml/method" /> </service> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest> 

  • Comment enregistrer de l'audio sur la page Web (iOS, Android, PC / Mac) - sans flash
  • Android parentActivity ne se recréant pas après les retours startActivityForResult
  • Mise à jour de conflits de version pour play-services 9.4.0 Studio Android 2.2
  • Comment ouvrir une deuxième activité sur le bouton Cliquez sur le bouton dans l'application Android
  • Comment analyser une clé JSON dynamique dans un résultat JSON imbriqué?
  • Comment accepter un appel entrant en cliquant sur un bouton?
  • 6 Solutions collect form web for “Disposition de clavier personnalisée Android laissant une marge de blanc sur le côté”

    Je ne peux pas reproduire l'erreur, j'ai fourni une capture d'écran, avec une application de fond clair et tout mon code pertinent. Je ne sais pas exactement où vous allez mal sans voir l'ensemble du projet et les répertoires, donc j'ai posté le xml pertinent. Il y a aussi une classe de service, je n'ai pas inclus (comme vous l'avez bien compris).

    Le code <Keyboard> trouve dans un fichier appelé qwerty.xml dans le dossier resources / xml, avec un fichier appelé method.xml:

    J'ai utilisé toutes les dimensions de votre clavier dans le qwerty.xml, sauf que j'ai remplacé l'image.

    method.xml

     <?xml version="1.0" encoding="utf-8"?> <input-method xmlns:android="http://schemas.android.com/apk/res/android"> <subtype android:label="@string/subtype_en_US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" /> </input-method> 

    Deux fichiers de mise en page:

    keyboard.xml

     <?xml version="1.0" encoding="UTF-8"?> <android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:keyPreviewLayout ="@layout/preview" /> 

    preview.xml

     <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" android:gravity="center" android:textSize="30sp android:textStyle="bold"> </TextView> 

    Modes:

     <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources> 

    Dans le manifeste, dans la demande:

     <service android:name=".SimpleIME" android:label="@string/simple_ime" android:permission="android.permission.BIND_INPUT_METHOD" > <meta-data android:name="android.view.im" android:resource="@xml/method"/> <intent-filter> <action android:name="android.view.InputMethod"/> </intent-filter> </service> 

    J'ai laissé l'image si grande pour que vous puissiez voir clairement qu'il n'y a pas d'espace. Entrez la description de l'image ici

    Ce lien ici passe également par ce code:

    http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android–cms-22615

    Modifier 1

    Après discussion dans les commentaires, je suggère de vérifier votre style d'arrière-plan car il y a des problèmes / modifications avec la couleur d'arrière-plan par défaut peut apparaître pour la fenêtre du clavier. Ceci est abordé en détail dans cette réponse https://stackoverflow.com/a/33052648/3956566 . Je ne vais pas réitérer les détails, car le lien ne risque pas de pourrir, étant un message SO upvoted.

    Modifier 2

    Ok Ajout de la différence dans le service de méthode d'entrée:

     @Override public void onKey(int primaryCode, int[] keyCodes) { InputConnection ic = getCurrentInputConnection(); switch(primaryCode){ case Keyboard.KEYCODE_DELETE : ic.deleteSurroundingText(1, 0); break; case Keyboard.KEYCODE_SHIFT: caps = !caps; keyboard.setShifted(caps); kv.invalidateAllKeys(); break; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); break; default: char code = (char)primaryCode; if(Character.isLetter(code) && caps){ code = Character.toUpperCase(code); } ic.commitText(String.valueOf(code),1); } } 

    Modifier 3

    Créez un projet en blanc, aucune activité pour votre clavier, pour le tester et l'exécuter comme une application distincte. Vous utilisez android:theme="@style/AppTheme.NoActionBar" Dans votre activité de lancement et il peut y avoir un problème avec l'opacité du fond et vos fenêtres / vues.

    Dans votre cas: 7 (touches) x 14% = 98% + 1% d'intervalle (firstkeyś horizontalGap ) = 99%.

    Mettez le '% 1' dans horizontalGap dans la dernière touche comme vous l'avez fait dans la première touche.

     <Row> <Key android:codes="49" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="1%p" android:keyEdgeFlags="left"/> <Key android:codes="50" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="51" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="52" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="53" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="54" android:keyIcon="@drawable/rsz_emoji"/> <Key android:codes="48" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="1%p" android:keyEdgeFlags="right"/> </Row> 

    Avez-vous essayé d'ajouter ceci à la balise du clavier dans votre fichier xml?

     android:layout_height="fill_parent" android:layout_width="fill_parent" 

    Ajoutez une ligne avec une largeur de 100% et une hauteur de zéro avant la première rangée. comme ça. Ajoutez ce code avant la première ligne

     <Row android:horizontalGap="0%p" android:keyHeight="0.01%p"> <Key android:codes="32" android:keyLabel="" android:keyWidth="100%p" /> </Row> 

    J'ai eu ce problème également. Je n'ai jamais trouvé une bonne solution.

    L'API de mise en page du clavier Android est nul. Si je le faisais encore une fois, je ne l'aurais pas utilisé et créé ma propre interface utilisateur à partir de l'interfaçage avec directement InputMethod .

    Dans tous les cas, ma solution était d'ajouter une clé supplémentaire au bas de la mise en page avec une hauteur de 100% et une hauteur de 1 pence.

    Le bouton ne fait absolument rien et la hauteur est si faible que l'utilisateur ne le voit pas. Mais la largeur de la clé corrige le problème de l'écart.

    Si la vision du clavier est dans une mise en page, assurez-vous que les paramètres de rembourrage sont réglés sur 0dp.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.