Android:KeyboardView没有出现在EditText上方

时间:2010-10-28 11:07:58

标签: android popupwindow

我正在尝试EditText,并且当用户点按EditText时,可以在屏幕底部显示键盘。我知道InputMethodService和SoftKeyboard示例,但我不能以这种方式使用它,因为我的键盘只能用于此EditText

此外,应该有一个上下文菜单,但这不是这个问题的一部分(我认为)。

我已经阅读了大量代码片段,但在很多情况下它们包含的方法不再可用(即getViewInflate())或者是在我不理解或不能理解的上下文中编写的翻译成我的代码(请注意,我是Android的新手)。

在大多数尝试中,当我点按EditText

时,我失败了
java.lang.IllegalArgumentException: width and height must be > 0

后跟一个不包含任何类的堆栈跟踪。正如您在下面的代码中看到的,所有尺寸都已设置。

下面你看到的是代码的当前状态(我删除了一些代码,我希望它仍然有意义)。我还试图在主线程中使用handler.post()内部的内容,使用注释的内容而不是handler.post() ...

以下内容不是尝试在一个布局XML中使用RelativeLayout EditTextKeyboardView。有一个不同的例外,例如“无效类型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 个答案:

答案 0 :(得分:3)

经过几个小时的“研究和尝试”之后,我终于理解了我的错误,这似乎是“sjngm”的错误。要呈现虚拟键盘,您必须

  1. 通过膨胀布局xml文件或通过在行中声明KeyboardView来声明视图(正如您对其他View所做的那样)。
  2. 这里忘记了什么:用findViewById()检索你的KeyboardView并调用它: keyboardViewInstance.setKeyboard(new Keyboard(...) );
  3. 就是这样。您将能够在屏幕上看到您的keyboardView!当然,您需要创建自己的Keyboard类,或者使用现有的键盘类来定义键盘键(res/xml/keyboard.xml)的xml资源文件。

答案 1 :(得分:0)

我正在重新发明我的方法,因为我认为我没有打破InputMethodService足以让它在没有自己的情况下工作。换句话说,我扔掉了样本并从头开始使布局工作(它现在是一个布局而不是两个),然后从示例中添加代码以正确处理输入。

经过进一步研究,我发现了一个关于App-specific soft-keyboard的非常有用的问题。如果遇到我的情况,那就去看看吧。