为什么DialogFragment会在首次在Android中导航时为其EditText视图隐藏键盘?

时间:2018-03-26 14:41:22

标签: android android-edittext android-dialogfragment

在我的一个应用程序片段中,我需要显示一个带有EditText的DialogFragment,但是,当它显示时,软键盘就消失了。我需要触摸EditText以便键盘可以显示,即使它有焦点并且我手动设置要显示的输入方法应该使其自动显示。 我实际上知道如何通过使用下面的代码观察viewtree来解决问题

EditView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (!isKeyBoardVisible()) {
                    if (EditView.hasFocus()) {
                        getActivity().getWindow()
                                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                        Utils.showSoftKeyboard(getContext(), searchView);
                    } 
                }
            }
        }); 

问题是我在很多地方都有EditText视图,而且它们似乎并不适用于所有这些地方。所以我需要在上面添加代码,我认为这不是一个好主意。我想知道为什么 EditText视图会在这种情况下隐藏软键盘,以便我可以提出一些更好的解决方案或说服自己有必要这样做。您可以玩的最小应用程序如下所示 活性

package com.example.litaos.testeditview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.see_fragment);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TestDialogFragment testDialogFragment = new TestDialogFragment();
                testDialogFragment.show(getSupportFragmentManager(), TestDialogFragment.FRAGMENT_TAG);
            }
        });
    }
}

活动xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.litaos.testeditview.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/see_fragment"
        android:text="See First Fragment!"
        android:focusable="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </Button>

</android.support.constraint.ConstraintLayout>

DialogFragment

package com.example.litaos.testeditview;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class TestDialogFragment extends DialogFragment {
    public static final String FRAGMENT_TAG = "addTestDialogFragment";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.dialog_fragment, container, false);
        EditText editText = view.findViewById(R.id.edit_text);
        if (editText.requestFocus()) {
            InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
            getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
        return view;
    }
}

DialogFragment xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/edit_text"
        android:hint="Click Here!"
        android:focusable="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </EditText>

</android.support.constraint.ConstraintLayout>

2 个答案:

答案 0 :(得分:0)

如果你想在视图开始时显示软键盘,那么你只需要将这行代码放在清单中的相关活动标签中:

   android:windowSoftInputMode="stateVisible"

答案 1 :(得分:0)

我认为你不得不使用观察者来实现这一目标。这两行代码很容易解决您的问题。

EditText editText = view.findViewById(R.id.edit_text);
if(editText.requestFocus()) {
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }

编辑: 我只是假设它是单个EditText,就像上面发布的最小版本一样。这就是我解决类似问题的方法。注意:我使用的是AlertDialog而不是DialogFragment。

   AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Title");

    //inflate custom layout for editText (with appropriate margins and dimensions)
    LayoutInflater inflater = this.getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
    builder.setView(dialogView);

    final EditText input = dialogView.findViewById(R.id.editTextDialog);
    if(input.requestFocus()) {
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }
    // Set up the buttons
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
           //OK button action
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //cancel button action
            dialog.cancel();
        }
    });

    AlertDialog dialog = builder.create();
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();

对话框XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical">

    <EditText
        android:id="@+id/editTextDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:inputType="textCapSentences"
        />

</LinearLayout> 

我希望它有所帮助!