如何在输入法的输入区域中使用自定义字体?

Ted*_*opp 15 android android-softkeyboard android-input-method android-edittext

我们正在开发一个应用程序,我们需要使用自定义字体(Typeface从应用程序的资产中加载)EditText.所述的Android输入方法文档声明如下:

当输入焦点移入或移出可编辑的文本字段时,Android会根据需要显示或隐藏输入法(例如屏幕键盘).系统还会决定UI和文本字段在输入方法上方的显示方式.例如,当屏幕上的垂直空间受到约束时,文本字段可能会填充输入方法上方的所有空间.

这是大胆的部分让我们绊倒.短语"文本字段可能填充..."似乎具有误导性,因为使用的文本字段不是EditText我们使用自定义字体设置的字段.(注意:到目前为止的答案都解释了如何设置自定义字体EditText.我们已经在设置自定义字体EditText.请在回答前仔细阅读问题.)这是隐藏输入法的屏幕截图:

对话框

这是软键盘显示和垂直空间受限时会发生的情况:

约束垂直空间

如您所见,输入法上方文本字段中的字体不是我们的自定义字体(我猜它是系统的默认Roboto字体).对于我们尝试作为输入法的每个软键盘都会发生这种情况.

我想强调的是,当空间受限制时,键盘上方的这个视图是由系统内部生成的,而不是由我们的任何代码生成的.

主要问题是:是否有一种方法(如果是这样,它是什么?)来控制这种方式的外观(缺乏更好的术语)代理视图 - 至少让它使用我们的自定义字体?

如果我们还可以控制键盘上方整个代理区域的布局和外观(包括"完成"按钮),这将是一个额外的好处.我们使用此线程中描述的技术的变体来使我们的活动使用与系统中设置的区域不同的区域设置,但是活动的区域设置显然未在此处应用.(如果是的话,按钮会在左边,并且会显示"בוצע",如果我将设备的区域设置更改为希伯来语,就会发生这种情况.[编辑:我可以通过使用该android:imeActionLabel属性获得正确的按钮标签EditText.但是,我不知道如何控制布局方向性.])

编辑每个请求,这是我如何构建我的对话框(相关部分摘自a DialogFragment):

public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dlg = new Dialog(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar);
    dlg.setContentView(R.layout.edit_note_dialog);
    mAnimator = (ViewAnimator) dlg.findViewById(R.id.animator);
    final Typeface hebrew = SystemData.getHebrewFont();
    mNoteEditor = (EditText) dlg.findViewById(R.id.note_field);
    mNoteEditor.setTypeface(hebrew);

    // etc. (setting fonts for other elements, adding listeners, etc.)
}
Run Code Online (Sandbox Code Playgroud)

这是布局:

<?xml version="1.0" encoding="utf-8"?>
<ViewAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/animator"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:paddingTop="10dp"
        android:text="@string/loading" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:background="@android:color/black"
            android:gravity="center"
            android:text="@string/edit_note_title"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/citation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/title"
            android:layout_centerHorizontal="true"
            android:background="@android:color/black"
            android:gravity="center"
            android:textColor="@android:color/white"
            android:textSize="16sp" />

        <LinearLayout
            android:id="@+id/actions"
            style="?android:attr/buttonBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_margin="5dp" >

            <Button
                android:id="@+id/cancel"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:gravity="center"
                android:minWidth="32dp"
                android:text="@string/cancel"
                android:textSize="@dimen/nav_interior_item_size" />

            <Button
                android:id="@+id/close"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:gravity="center"
                android:minWidth="32dp"
                android:text="@string/save"
                android:textSize="@dimen/nav_interior_item_size" />
        </LinearLayout>

        <Button
            android:id="@+id/undo"
            style="?android:attr/buttonBarButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentStart="true"
            android:layout_margin="5dp"
            android:text="@string/edit_note_undo"
            android:textSize="@dimen/nav_interior_item_size" />

        <Button
            android:id="@+id/redo"
            style="?android:attr/buttonBarButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_margin="5dp"
            android:text="@string/edit_note_redo"
            android:textSize="@dimen/nav_interior_item_size" />

        <EditText
            android:id="@+id/note_field"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@+id/actions"
            android:layout_below="@+id/citation"
            android:focusableInTouchMode="true"
            android:gravity="top"
            android:hint="@string/edit_note_hint"
            android:imeActionLabel="@string/done"
            android:inputType="textMultiLine|textNoSuggestions"
            android:lineSpacingMultiplier="1.2" />
    </RelativeLayout>

</ViewAnimator>
Run Code Online (Sandbox Code Playgroud)

paw*_*eba 4

如果您有一个 InputMethodService 实例,那就很简单了。有一种方法可以设置主题甚至设置提取视图

问题是您必须创建输入法的自定义实现,并且用户必须在系统设置中选择它。

更新:

您可以尝试:

    • android:windowSoftInputMode="adjustResize"
    • 使视图可滚动

或者

    • 使用 IME_FLAG_NO_EXTRACT_UI
    • 设置OnEditorActionListener以便EditText键盘上有一个操作按钮。
    • 当屏幕高度太小时创建自定义布局或隐藏/显示元素。例如,隐藏底部的按钮并在右侧显示按钮。它看起来与默认的提取视图类似。

对话框或 EditText 的布局侦听器:

    mViewContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //unregister the layout listener if needed.
            int heightPixels = mViewContainer.getHeight();
            Resources resources = mContext.getResources();
            int heightDip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, heightPixels, resources.getDisplayMetrics());
            if (heightDip < MIN_HEIGHT) {
                mBottomButtons.setVisibility(View.GONE);
                mSideButtons.setVisibility(View.VISIBLE);
            } else {
                mBottomButtons.setVisibility(View.VISIBLE);
                mSideButtons.setVisibility(View.GONE);                    
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

将可见性更改为 GONE 将请求重新布局,并且侦听器将再次运行,这可能会导致循环。