2016-07-12 14 views
8

Ich verwende TabLayout, um verschiedene Eingabemethoden anzuzeigen. Die erste Registerkarte enthält Schaltflächen und die vierte Registerkarte sollte die in dieser TabLayout eingebettete Standardtastatur anzeigen. Hier ein Screenshot, wie es aussehen sollte:Anzeige der virtuellen Tastatur in Android TabLayout

enter image description here

Die TabLayout funktioniert so weit. Ich habe versucht, eine Layout-XML-Datei mit einem KeyboardView zu erstellen. Aber die App zeigt keine Tastatur:

<?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" 
    /> 

Wenn ich eine einfache Textview verwenden, die App zeigt den Text ... so die TabLayout selbst arbeitet:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="This is a tab layout" 
     android:id="@+id/textView" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

Meine Frage Wie kann ich eine einfache Tastatur erstellen und diese im TabLayout anzeigen? Vielen Dank!

+0

Ich bin nicht sicher, aber haben Sie versucht, auf Ihre KeyboardView eine bestimmte Höhe spezifizieren? Wie ungefähr 250dp oder etwas? –

Antwort

1

In meinem Fragmente brauchte ich ein paar Zeilen Code, zum Beispiel ich ein Layout-XML hinzufügen musste:

public class SQLConsoleTab2Fragment extends SQLConsoleFragment implements KeyboardView.OnKeyboardActionListener { 

    public KeyboardView keyboard123; 
    public View Tab2View; 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//execute(v) 


     Tab2View = inflater.inflate(R.layout.tab2, container, false); 
     keyboard123 = (KeyboardView) Tab2View.findViewById(R.id.keyboard123); 

     Keyboard k1 = new Keyboard(Tab2View.getContext(), R.xml.qwerty_keyboard); 


Tab2View.findViewById(R.id.keyboard123); 
     keyboard123.setKeyboard(k1); 
     keyboard123.setEnabled(true); 
     keyboard123.setPreviewEnabled(true); 

     keyboard123.setOnKeyboardActionListener(this); 

     return Tab2View; 
    } 
} 
1

Ich schrieb einen IME vor zwei Jahren. Ihr Fall ist anders als meiner, aber die Idee sollte die gleiche sein.

Das Problem ist, dass Sie kein Tastaturlayout für die Tastaturansicht angegeben haben.

Siehe Code:

@Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // Round up a little 
     if (mKeyboard == null) { 
      setMeasuredDimension(mPaddingLeft + mPaddingRight, mPaddingTop + mPaddingBottom); 
     } else { 
      int width = mKeyboard.getMinWidth() + mPaddingLeft + mPaddingRight; 
      if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { 
       width = MeasureSpec.getSize(widthMeasureSpec); 
      } 
      setMeasuredDimension(width, mKeyboard.getHeight() + mPaddingTop + mPaddingBottom); 
     } 
    } 

Die mKeyboard variable Katze über setKeyboard eingestellt werden. Was Sie tun sollten:

  1. eine Datei Tastaturlayout erstellen in Ressourcenordner
  2. eine Keyboard Instanz erstellen und es dem Ausführen des Codes KeyboardView
  3. Versuchen gesetzt.
1

ich nicht schreiben über andere Informationen, so dass ich denke Sinn voll Schritte für die Arbeit mit Tastatur, basierend auf doc schreiben machen, oder, This Example:

1 Ändern Manifest durch Hinzufügen von Eigenschaften (auf Aktivität oder Service)

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

2) erstellen Hauptdatei mit Tastatur Eigenschaften:

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

3) Definieren KeyboardView in Layout (wie du)

<?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" 
/> 

4) definieren Tasten auf der Tastatur (nur ein Beispiel):

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" 
    android:keyWidth="10%p" 
    android:horizontalGap="0px" 
    android:verticalGap="0px" 
    android:keyHeight="60dp" > 
    <Row> 
     <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/> 
     <Key android:codes="50" android:keyLabel="2"/> 
     <Key android:codes="51" android:keyLabel="3"/> 
     <Key android:codes="52" android:keyLabel="4"/> 

     // .......... 
</Keyboard> 

5) definieren einen Dienst oder erweitern diese Schnittstellen in Acitivity:

public class SimpleIME extends InputMethodService 
    implements OnKeyboardActionListener{ 

    private KeyboardView kv; 
    private Keyboard keyboard; 

    private boolean caps = false; 

    @Override 
    public void onKey(int primaryCode, int[] keyCodes) {   

    } 

    @Override 
    public void onPress(int primaryCode) { 
    } 

    @Override 
    public void onRelease(int primaryCode) {    
    } 

    @Override 
    public void onText(CharSequence text) {  
    } 

    @Override 
    public void swipeDown() { 
    } 

    @Override 
    public void swipeLeft() { 
    } 

    @Override 
    public void swipeRight() { 
    } 

    @Override 
    public void swipeUp() { 
    } 
} 

6) Dann nur Methoden für Maßnahmen aktualisieren, basierend auf Beispiel oder doc. Das ist alles ...