如何在Android中的片段中完美展示软键盘?

前端之家收集整理的这篇文章主要介绍了如何在Android中的片段中完美展示软键盘?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Activity中的Fragment中有一个EditText.

我的活动布局:

<?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:background="@drawable/login_bg">
    ...

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    ...

</RelativeLayout>

AndroidManifest.xml中的我的Activity配置:

<activity
        android:name="com.demo.LoginActivity"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:theme="@style/activityTheme" />

用于在Activity中启动片段的代码

private void startFragment(BaseFragment fragment,String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_container,fragment);
    fragmentTransaction.addToBackStack(tag);
    fragmentTransaction.commitAllowingStateLoss();
}

我的片段布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_background_color_white"
    android:orientation="vertical"
    android:clickable="true"
    android:paddingLeft="@dimen/email_common_padding_horizontal"
    android:paddingRight="@dimen/email_common_padding_horizontal">

    ...

    <com.example.widget.LineEditView
        android:id="@+id/login_email_input"
        style="@style/BaseEditText.LoginEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
    />

    ...

</LinearLayout>

我的自定义小部件LineEditView是一个子类扩展RelativeLayout,它的布局:

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

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:gravity="start|center_vertical"
        android:background="@android:color/transparent"
        android:textColor="@color/common_text_color_black"
        android:maxLines="1"
        android:textCursorDrawable="@drawable/common_cursor_background_orange"
        android:textSize="@dimen/email_fields_text_size"
        android:paddingBottom="@dimen/email_fields_text_padding_bottom"/>

    <View
        android:id="@+id/underline"
        android:layout_below="@id/edit"
        android:layout_width="match_parent"
        android:layout_height="2px"/>
</RelativeLayout>

我想根据EditText的inputType属性显示键盘,并且可以轻松隐藏.

我尝试过但不工作或不完美:

1.根据Show keyboard for edittext when fragment starts可以显示键盘但不能轻易隐藏(有时甚至无法隐藏)并且它根据EditText的inputType属性显示键盘.

2.我将以下代码添加到My Fragment:

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container) {
    mEditText = (EditText) rootView.findViewById(R.id.edit);
    mEditText.requestFocus();
    mEditText.setFocusable(true);
}

@Override
public void onResume() {
    mEditText.postDelayed(mShowSoftInputRunnable,400);
    super.onResume();
}

private Runnable mShowSoftInputRunnable = new Runnable() {
    @Override
    public void run() {
        FragmentActivity activity = getActivity();
        if (activity == null)
            return;

        InputMethodManager input = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        input.showSoftInput(mEditText,InputMethodManager.SHOW_IMPLICIT);
    }
};

但它在我的片段中根本无法显示键盘.

我不能将EditText放到Activity中,因为它需要重构很多代码.

有没有人有想法解决这个问题?

解决方法

这是我使用的代码,它在Fragments中运行得非常好
public static void hideKeyboard(Context context) {
    try {
        ((Activity) context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        if ((((Activity) context).getCurrentFocus() != null) && (((Activity) context).getCurrentFocus().getWindowToken() != null)) {
            ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(((Activity) context).getCurrentFocus().getWindowToken(),0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void showKeyboard(Context context) {
    ((InputMethodManager) (context).getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
}
原文链接:/android/317545.html

猜你在找的Android相关文章