2015-11-09 126 views
10

我正在爲Android設計一個自定義鍵盤,而且我遇到了鍵盤似乎在右側留下白線/空白的問題填充父視圖...(不介意的圖標,它只是一個佔位符圖形現在)Android自定義鍵盤佈局在側邊留下白邊

Screenshot from the simulator

下面你可以看到我的佈局......

<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> 

據正如我所見,這是一個1%p的問題......但我有點不確定如何填充它而不會搞亂我的路線...將第一行中的差距改爲2會解決它,但搞亂了對齊。

爲你添加額外的代碼,請...

我的類擴展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() { 

    } 

我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> 

清單:

<?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> 
+0

如何自定義鍵盤! –

+0

@tinysunlight那是一個答案嗎? :/ – user969043

+0

因爲我從來沒有看到鍵盤標籤! –

回答

2

在你的情況下:圖7(鍵)×14%= 98%+ 1個%間隙(firstkeyśhorizontalGap)= 99%。

將最後一個鍵中的'%1'放入horizontalGap中,就像您在第一個鍵中所做的一樣。

<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> 
+0

這會在最後一個鍵的左側添加間隔... – user969043

+0

是的。 ..將填補右邊的「白色空間」... – Christian

+0

是的,但最後一個鍵左側的缺口會毀掉用戶界面...因爲缺口應該在右邊......這個會在第二行和第一行的最後一個按鈕之間添加一個醜陋的空間... – user969043

2

您是否嘗試將此項添加到xml文件中的鍵盤標記中?

android:layout_height="fill_parent" 
android:layout_width="fill_parent" 
+0

同樣的結果不幸 – user969043

+0

我會看到它。 – sayan

7

我無法重現錯誤,我提供了一個截屏,一個淺色背景應用程序和所有我的相關代碼。如果沒有看到整個項目和目錄,我不確定你到底發生了什麼,所以我發佈了相關的xml。還有一個服務類,我沒有包括(因爲你顯然有它的工作)。

<Keyboard>代碼是在一個名爲在資源/ XML文件夾qwerty.xml文件,一個叫method.xml文件:

我用你所有的鍵盤尺寸在qwerty.xml,除了我替換的圖像。

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> 

兩個佈局文件:

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> 

樣式:

<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> 

在清單中,應用程序中:

<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> 

我已經離開了形象如此之大,所以你可以清楚地看到沒有縫隙。 enter image description here

這裏這個鏈接也一步一步地驗證碼:

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

編輯1

在評論中討論後,我會建議,因爲有問題,檢查你的背景風格/可能會顯示鍵盤窗口的默認背景色的更改。這是在這個答案https://stackoverflow.com/a/33052648/3956566詳細問題。我不會重申細節,因爲這個鏈接不太可能腐爛,因爲這是一個高調的SO帖子。

編輯2

確定添加的輸入法服務的區別:

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

編輯3

創建一個空白的項目,爲您的鍵盤沒有活動,以測試並作爲一個單獨的應用程序運行。您正在使用android:theme="@style/AppTheme.NoActionBar"在您的啓動器活動中,可能存在背景不透明和Windows /視圖問題。

+0

我實際上遵循了在鍵盤上發佈鏈接的教程,但我的鍵盤和method.xml與您的鍵盤相同,除了我不使用鍵盤的預覽...所以我在考慮錯誤不知何故是在鍵盤佈局xml文件,我發佈在我的問題...我不確定,爲什麼你不能重現,因爲教程是我跟着的確切的一個,我唯一的區別是我的佈局.. 。現在,我已經通過改變按鈕尺寸來解決問題了,但這並不是我想要解決的問題... – user969043

+0

@ user969043對所有的問題都抱歉,我回到了繪圖板,你有沒有檢查主題?主題的默認背景窗口/視圖和鍵盤的樣式之間可能會有衝突。我使用與鍵盤佈局完全相同的xml。並注意我將它命名爲qwerty.xml。 –

+0

我已經在問題中更新了我的代碼... – user969043

0

我也有這個問題。我從未找到一個好的解決方案。

Android的鍵盤佈局API很糟糕。如果我再一次這樣做,我就不會使用它,而是直接創建自己的用戶界面,從頭開始與InputMethod接口。

在任何情況下,我的解決方案是在佈局的底部添加一個額外的鍵,寬度爲100%,高度僅爲1dp。

該按鈕沒有任何功能,高度非常小,用戶看不到它。但是關鍵的寬度解決了差距問題。

1

在第一行之前添加一行,寬度爲100%,零高度。 是這樣的。第一行之前添加以下代碼

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

 
    </Row>

0

如果keyboardview是在佈局,確保填充參數設定爲0dp。

+0

你可以在評論中提問 –