Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display virtual keyboard in android TabLayout

I'm using TabLayout to display different input methods. The first tab contains buttons and the fourth tab should display the standard keyboard embedded in this TabLayout. Here a screenshot how it should look like:

enter image description here

The TabLayout works so far. I tried to create a layout XML file with a KeyboardView. But the app doesn't show a keyboard:

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

If I'm using a simple Textview, the app displays the text ... so the TabLayout itself is working:

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

My question is how can I create a simple keyboard and display it within the TabLayout? Thank you!

like image 304
Stefan Brendle Avatar asked Jul 12 '16 10:07

Stefan Brendle


3 Answers

I wrote an IME about two years ago. Your case is different from mine but the idea should be the same.

The problem is you didn't specify a Keyboard Layout for the keyboard view.

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

The mKeyboard variable cat be set via setKeyboard. What you should do is :

  1. Create a keyboard layout file in resource folder
  2. Create a Keyboard instance and set it to the KeyboardView
  3. Try running the code.
like image 159
suitianshi Avatar answered Oct 20 '22 06:10

suitianshi


I didn't write about any other information, so I think make sense write full steps for working with keyboard, based on doc, or, This Example:

1 Change Manifest by adding properties (to activity or 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) Create main file with Keyboard properties:

<?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) Define KeyboardView in layout (as you did)

<?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) Define keyboard keys (just an example):

<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) Define a service or extend this interfaces 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) Than just update methods for action, based on example or doc. That is all...

like image 30
GensaGames Avatar answered Oct 20 '22 07:10

GensaGames


In my fragment I needed some lines of code, for example I had to add a Layout XML:

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;
    }
}
like image 21
Stefan Brendle Avatar answered Oct 20 '22 06:10

Stefan Brendle