简体   繁体   English

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

[英]How to show soft keyboard perfectly in fragment in Android?

I have an EditText inside a Fragment inside a Activity. 我在Activity中的Fragment中有一个EditText。

My Activity layout: 我的活动布局:

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

My Activity config in AndroidManifest.xml: AndroidManifest.xml中的我的Activity配置:

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

My code that use to start fragment in Activity: 用于在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();
}

My Fragment layout: 我的片段布局:

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

My Custom Widget LineEditView is a child class extend RelativeLayout ,and it layout: 我的自定义小部件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> 

I want to show soft keyboard according to inputType property of EditText,and can hide easily. 我想根据EditText的inputType属性显示软键盘,并且可以轻松隐藏。

What I have tried but not work or not perfect: 我尝试过但不工作或不完美:

1.According to Show keyboard for edittext when fragment starts can show soft keyboard but can not hide easily(even can not hide sometimes) and it show keyboard not according to inputType property of EditText. 1. 根据编辑文本的显示键盘,当片段启动时可以显示软键盘但不能轻易隐藏(有时甚至无法隐藏)并且它根据EditText的inputType属性显示键盘。

2.I add following code to My Fragment: 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);
    }
};

but it can not show soft keyboard at all in my fragment. 但它在我的片段中根本无法显示软键盘。

I can not put EditText to Activity because it need to refactor a lot of code. 我不能将EditText放到Activity中,因为它需要重构很多代码。

Does anyone have ideas to solve this problems? 有没有人有想法解决这个问题?

Here is the code I use which works very well in Fragments 这是我使用的代码,它在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);
}

hideSoftKeyboard hideSoftKeyboard

In fragment need to call this when want to hide keyboard 片段需要在想要隐藏键盘时调用此方法

hideSoftKeyboard(getActivity());

Call function 通话功能

  private void hideSoftKeyboard(Activity activity)
{
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

showSoftKeyboard showSoftKeyboard

You call this for show keyboard in frament with pass the edittext 你通过编辑文本调用此框架中的显示键盘

 EditText edittext=(EditText) findViewById(R.id.edittext);
 showSoftKeyboard(edittext);

call this function 叫这个功能

 public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager)getActivity(). getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM