Android: KeyboardView не отображается над EditText - PullRequest
0 голосов
/ 28 октября 2010

Я пытаюсь получить EditText и возможность отображать клавиатуру внизу экрана, когда пользователь нажимает EditText.Я знаю о InputMethodService и примере SoftKeyboard, но я не могу использовать его таким образом, поскольку моя клавиатура должна быть доступна только для этого самого EditText.

Кроме того, должен бытьконтекстное меню, но это не является частью этого вопроса (я думаю).

Я прочитал множество фрагментов кода, но во многих случаях они содержат методы, которые больше не доступны (например, getViewInflate())или написаны в контексте, который я не понимаю или не могу перевести в мой код (учтите, что я новичок в отношении Android).

В большинстве попыток я терплю неудачу с этим исключением, когда нажимаюEditText:

java.lang.IllegalArgumentException: width and height must be > 0

с последующей трассировкой стека, которая не содержит ни одного из моих классов.Как вы можете видеть в приведенном ниже коде, все размеры установлены.

Ниже вы видите текущее состояние кода (я удалил часть кода, и надеюсь, что он все еще имеет смысл).Я также пытался использовать то, что находится внутри handler.post() в главном потоке, использовать комментарии с комментариями вместо handler.post() ...

. Что не ниже, так это попытка использовать RelativeLayout с EditText и KeyboardView в одном макете-XML.Было другое исключение, что-то вроде «неверный тип 0x12» или что-то подобное при создании макета.

Это просто не работает, или я просто не знаю, как это сделать.Может кто-нибудь, пожалуйста, проведите меня через это?Пожалуйста, дайте мне знать, если чего-то не хватает.

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <EditText
    android:id="@+id/field_input"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:inputType="textMultiLine|textImeMultiLine"
    android:typeface="monospace"
    android:gravity="top|left"
    android:maxLength="255"
    />
</LinearLayout>

keyboard.xml:

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

LatinKeyboardView.java:

import android.inputmethodservice.KeyboardView;

public class LatinKeyboardView extends KeyboardView {
    :
}

EditorActivity.java

import android.app.Activity;

public class EditorActivity extends Activity {
    private View keyboardLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        final EditText inputField;

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        keyboardLayout = (View)getLayoutInflater().inflate(R.layout.keyboard, null, false);
        inputField = (EditText)findViewById(R.id.field_input);
        registerForContextMenu(inputField);

        inputField.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());

                    handler.post(new Runnable() {
                            @Override
                            public void run() {
                                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                //PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.input, null, false), 100, 100, true);
                                PopupWindow pw = new PopupWindow(keyboardLayout, 100, 100, true);

                                pw.showAtLocation(findViewById(R.id.field_input), Gravity.CENTER, 0, 0);
                            }
                        });

/*
                    if (keyboardLayout.getVisibility() == View.GONE) {
                        // Show Media Player
                        TranslateAnimation mAnimUp = 
                            new TranslateAnimation(
                                    Animation.RELATIVE_TO_SELF, 0,
                                    Animation.RELATIVE_TO_SELF, 0,
                                    Animation.RELATIVE_TO_SELF, -keyboardLayout.getHeight(),
                                    Animation.RELATIVE_TO_SELF, 0);

                        mAnimUp.setStartOffset(500);
                        mAnimUp.setDuration(500);

                        keyboardLayout.setVisibility(View.VISIBLE);
                        keyboardLayout.setAnimation(mAnimUp);
                    }
*/
                }
            });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        :
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        :
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        :
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
        :
    }
}

Ответы [ 2 ]

3 голосов
/ 14 января 2012

После нескольких часов «исследований и попыток» я наконец понял свою ошибку, которая, похоже, является ошибкой «sjngm».Чтобы визуализировать виртуальную клавиатуру, вы должны

  1. объявить представление, надувая XML-файл макета или объявив в строке свой KeyboardView (так же, как вы сделали бы это для другогоView).
  2. И что здесь было забыто: получите KeyboardView с помощью findViewById() и вызовите его: keyboardViewInstance.setKeyboard(new Keyboard(...) );

Вот и все.Вы сможете увидеть вашу клавиатуру на экране!Конечно, вам нужно либо создать свой собственный класс Keyboard, либо использовать существующий с файлом ресурсов xml, определяющим ваши клавиши клавиатуры (res/xml/keyboard.xml).

0 голосов
/ 03 ноября 2010

В настоящее время я заново изобретаю свой подход, поскольку считаю, что не сломал InputMethodService достаточно, чтобы он работал без самого себя.Другими словами, я выбросил образец и начал с нуля, чтобы заставить работать макет (теперь это один макет вместо двух), а затем добавил код из образца для правильной обработки входных данных.

После дальнейшего исследования янашел действительно полезный вопрос о программной клавиатуре для приложения .Если вы столкнетесь с моей ситуацией, посмотрите там.

...