Android: แสดงคีย์บอร์ดนุ่มโดยอัตโนมัติเมื่อโฟกัสบน EditText


341

AlertDialogฉันแสดงกล่องใส่ใช้ EditTextภายในโต้ตอบของตัวเองจะเน้นโดยอัตโนมัติเมื่อผมเรียกAlertDialog.show()แต่แป้นพิมพ์อ่อนจะไม่แสดงโดยอัตโนมัติ

ฉันจะทำให้คีย์บอร์ดนุ่มแสดงโดยอัตโนมัติเมื่อไดอะล็อกถูกแสดงได้อย่างไร? (และไม่มีแป้นพิมพ์กายภาพ / ฮาร์ดแวร์) เช่นเดียวกับเมื่อฉันกดปุ่มค้นหาเพื่อเรียกใช้การค้นหาทั่วโลกแป้นพิมพ์นุ่มจะปรากฏขึ้นโดยอัตโนมัติ


1
สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติตามความคิดเห็นของเท็ดด้านล่าง ตรวจสอบก่อน!
Cheezmeister

คำตอบนี้ง่ายที่สุดและใช้งานได้ดี: stackoverflow.com/a/8018630/89818
caw


1
ฉันกลับมาที่คำตอบนี้หลายครั้งในช่วงหลายปีที่ผ่านมา มันอยู่ในกล่องโต้ตอบเสมอว่าฉันมีปัญหานี้ไม่แยกส่วนหรือกิจกรรม
tir38

อาจมีการทำซ้ำของการปิด / ซ่อน Android Soft Keyboard
Md Imran Choudhury

คำตอบ:


305

คุณสามารถสร้างฟังโฟกัสบนEditTextบนAlertDialogแล้วได้รับของAlertDialog จากนั้นคุณสามารถทำให้การแสดงแป้นพิมพ์อ่อนโดยการเรียกWindowsetSoftInputMode

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5
ฉันจะใช้งาน AlertDialog.Builder ได้อย่างไร ... สุดท้าย AlertDialog.Builder alert = ใหม่ AlertDialog.Builder (Main.this);
Stephen

6
@Stephen คุณสามารถรับไดอะล็อกจากตัวสร้างโดยใช้final AlertDialog dialog = builder.create()จากนั้นshowบนไดอะล็อกแทนตัวสร้าง
tidbeck

30
ฉันตอบกลับความคิดเห็นของฉันข้างต้นฉันพบว่าหากคุณไม่สามารถโฟกัสได้ถูกต้องลองดูที่ XML ของคุณ! หากคุณเห็นแท็ก<requestFocus> </requestFocus>อยู่ในนั้นให้ลบออก ดูเหมือนว่าแท็กจะให้ความสำคัญกับ EditText จากนั้นผู้ฟังของคุณจะไม่ถูกไล่ออกเนื่องจาก EditText มีโฟกัสอยู่แล้ว
Ted

11
คุณจะไม่ทำเช่นนี้หากอุปกรณ์มีแป้นพิมพ์ฮาร์ดแวร์ ดูเหมือนว่านี่จะน่ารำคาญสำหรับผู้ใช้เหล่านั้น
mxcl

8
ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงไม่ใช่พฤติกรรมเริ่มต้นใน SDK หากมุมมองที่ต้องการป้อนข้อความแสดงเคอร์เซอร์กะพริบทำไมบางคนไม่ต้องการเห็นคีย์บอร์ดเพื่อป้อนข้อความ? รู้สึกผิดที่ UX ถึงฉัน
Christian García

240

สำหรับการแสดงการใช้แป้นพิมพ์:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

สำหรับการซ่อนการใช้แป้นพิมพ์:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 

3
วิธีนี้จะทำงานได้ดีโดยเฉพาะเมื่อคุณต้องการแสดง / ซ่อนแป้นพิมพ์นุ่มโดยใช้การสลับการมองเห็นมุมมองในเค้าโครงของคุณระหว่าง VISIBLE และ GONE
PacificSky

38
ฉันขอแนะนำให้ใช้การตั้งค่าสถานะ SHOW_IMPLICIT แทนเนื่องจากหมายถึงการเปลี่ยนแปลงกิจกรรมหรือแอปพลิเคชันจะซ่อนแป้นพิมพ์โดยอัตโนมัติตามที่คาดไว้
drspaceboo

6
@drspaceboo การใช้ SHOW_IMPLICIT ไม่ทำงานเลยสำหรับฉันฉันต้องใช้ SHOW_FORCED ไม่แน่ใจว่าทำไม ...
Yoann Hercouet

1
เมื่อใดควรเรียกใช้รหัสข้างต้น ฉันลองทำหลังจากเพิ่มเลย์เอาต์ของฉันในแม่ของมัน นั่นไม่ได้ผล แต่ถ้าฉันทำมันหลังจากเลย์เอาต์มาระยะหนึ่งแล้วมันก็ใช้งานได้ ดังนั้นจะมีการเรียกกลับที่จะบอกฉันว่า "ถ้าคุณพยายามที่จะแสดงแป้นพิมพ์ตอนนี้มันจะใช้งานได้จริง"?
วิลเลียม Jockusch

1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) สลับคีย์บอร์ดอ่อน หากคุณต้องการให้แน่ใจว่าแป้นพิมพ์ปรากฏขึ้นคุณสามารถใช้ imm.showSoftInput (มุมมอง InputMethodManager.SHOW_IMPLICIT) แทนโดยที่มุมมองคือมุมมองที่จะรับอินพุต
PJ_Finnegan

111

คุณสามารถขอคีย์บอร์ดอ่อนได้ทันทีหลังจากสร้างกล่องโต้ตอบ (ทดสอบบน SDK - r20)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

สำหรับทุกคนที่สงสัยวิธีนี้จะไม่เปิดคีย์บอร์ดอ่อนเมื่อต่อคีย์บอร์ดฮาร์ดแวร์ ฉันเพิ่งทดสอบด้วยสาย USB On-The-Go ที่สมบูรณ์แบบ!
13rac1

นี่ไม่ได้ทำอะไรให้ฉันเลย
JohnyTex

ฉันไม่มีแป้นพิมพ์ฮาร์ดแวร์ อาจกำหนดค่า (?)
JohnyTex

25

ฉันมีปัญหาเดียวกันและแก้ไขด้วยรหัสต่อไปนี้ ฉันไม่แน่ใจว่ามันจะทำงานอย่างไรในโทรศัพท์ด้วยแป้นพิมพ์ฮาร์ดแวร์

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

อยู่ในระดับ API ของคลาส Dialog 8
tidbeck

ต้องถูกลบในภายหลังเมื่อ: /
Jacek Kwiecień

@ Xylian มันยังอยู่ในเอกสารDialog.setOnShowListener ()
tidbeck

23

ผมพบว่าตัวอย่างนี้http://android-codes-examples.blogspot.com/2011/11/show-or-hide-soft-keyboard-on-opening.html เพิ่มรหัสต่อไปนี้ก่อนหน้าalert.show()นี้

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

หรือ

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

ขอบคุณมากเพื่อนนี่ยอดเยี่ยมจริง ๆ ฉันใช้ทั้งคู่เพื่อแก้ปัญหาของฉันฉันมีสถานการณ์ที่ถ้าผู้ใช้อยู่ในโหมดเพิ่มจากนั้นต้องแสดงแป้นพิมพ์เมื่อเริ่มต้นกิจกรรมและสำหรับโหมดอัปเดตไม่จำเป็นต้องใช้แป้นพิมพ์ โดยค่าเริ่มต้น. ดังนั้นในรายการกิจกรรมที่ฉันตั้งstateHiddenและเมื่อฉันตรวจพบผู้ใช้กำลังสร้างรายการใหม่แล้วฉันแสดงแป้นพิมพ์โดยใช้บรรทัดรหัสที่คุณได้กล่าวถึง :) ขอบคุณอีกครั้ง
PHP Avenger

ฉันได้รับข้อความ 'ไม่สามารถแก้ไข getWindow ()' ได้ ฉันได้ลองใส่ 'สิ่งนี้' และสิ่งอื่น ๆ ก่อนหน้านี้ ฉันต้องการแป้นพิมพ์โดยไม่ใช้ edittext เพียงแค่คลิกที่ส่วนใดส่วนหนึ่งของหน้าจอ
Androidcoder

1
@Androidcoder ((Activity) context).getWindow()....มันเป็นส่วนหนึ่งของกิจกรรมเพื่อเพิ่มสิ่งที่ต้องการ
CoolMind

15

ตัวอย่างของรหัสจากคำตอบการทำงานอื่น ๆ แต่ก็ไม่เคยเห็นได้ชัดว่าจะวางไว้ในรหัสโดยเฉพาะอย่างยิ่งถ้าคุณกำลังใช้AlertDialog.Builderและปฏิบัติตามกวดวิชาโต้ตอบอย่างเป็นทางการเพราะมันไม่ได้ใช้หรือfinal AlertDialog ...alertDialog.show()

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

เป็นที่นิยมมากกว่า

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

เนื่องจาก SOFT_INPUT_STATE_ALWAYS_VISIBLE จะซ่อนแป้นพิมพ์หากโฟกัสสลับไปจาก EditText โดยที่ SHOW_FORCED จะเก็บแป้นพิมพ์ไว้จนกว่าจะถูกยกเลิกอย่างชัดเจนแม้ว่าผู้ใช้จะกลับไปที่หน้าจอโฮมหรือแสดงแอปล่าสุด

ด้านล่างคือรหัสที่ใช้งานได้สำหรับ AlertDialog ที่สร้างขึ้นโดยใช้เค้าโครงที่กำหนดเองโดยมี EditText ที่กำหนดใน XML นอกจากนี้ยังตั้งค่าคีย์บอร์ดให้มีปุ่ม "go" และอนุญาตให้เรียกใช้ปุ่มบวก

alert_dialog.xml:

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

        EditText editText = (EditText) alertDialog.findViewById(R.id.editText);

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}

11

นี่คือโพสต์เก่าที่ค่อนข้างมีบางสิ่งที่จะเพิ่ม
นี่เป็นวิธีการง่ายๆ 2 วิธีที่ช่วยให้ฉันใช้แป้นพิมพ์ภายใต้การควบคุมและทำงานได้อย่างสมบูรณ์แบบ:

แสดงแป้นพิมพ์

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

ซ่อนแป้นพิมพ์

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

คือgetCurrentFocus()อะไร
CoolMind

Activityผมเห็นว่าเป็นวิธีการอีกด้วย
CoolMind

10

ให้ฉันชี้ข้อมูลเพิ่มเติมไปที่วิธีแก้ปัญหาของ yuku เพราะฉันพบว่ามันยากที่จะได้งานนี้! ฉันจะรับวัตถุ AlertDialog จาก AlertDialog.Builder ของฉันได้อย่างไร เป็นผลมาจากalert.show()การกระทำของฉัน:

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});

7

ดูที่การสนทนานี้ซึ่งจัดการการซ่อนและแสดง IME ด้วยตนเอง อย่างไรก็ตามความรู้สึกของฉันคือถ้าผู้มุ่งเน้นEditTextไม่ได้เพิ่ม IME ขึ้นมาก็เพราะคุณกำลังโทรหาAlertDialog.show()คุณในวิธีการของคุณOnCreate()หรือวิธีการอื่นที่ปรากฏก่อนที่หน้าจอจะปรากฏขึ้นจริง ย้ายไปที่OnPostResume()ควรแก้ไขในกรณีที่ฉันเชื่อว่า


6

ใช่คุณสามารถทำกับsetOnFocusChangeListenerมันจะช่วยให้คุณ

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

4

ฉันรู้ว่าคำถามนี้เป็นคำถามเก่าโดยฉันคิดว่าการใช้ฟังก์ชันส่วนขยายเป็นวิธีที่ดีกว่าในการแสดงแป้นพิมพ์สำหรับข้อความแก้ไข

นี่คือวิธีที่ฉันใช้เพื่อแสดงแป้นพิมพ์สำหรับ edittext

รหัส kotlin: เพียงแค่ต้องโทรedittext.showKeyboard()

fun EditText.showKeyboard() {
  post {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
  }
}

รหัส java:

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }

3

หากใครได้รับ:

ไม่สามารถทำการอ้างอิงแบบสแตติกกับวิธีการไม่คงที่ getSystemService (String) จากประเภทกิจกรรม

ลองเพิ่มบริบทเพื่อรับการเรียก SystemService

ดังนั้น

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

1

คำถามเดิมเกี่ยวข้องกับไดอะล็อกและ EditText ของฉันอยู่ในมุมมองปกติ อย่างไรก็ตามฉันสงสัยว่าสิ่งนี้จะได้ผลกับคนส่วนใหญ่เช่นกัน ดังนั้นนี่คือสิ่งที่ใช้งานได้สำหรับฉัน (วิธีการจัดอันดับสูงสุดที่แนะนำข้างต้นไม่ได้ทำอะไรเลยสำหรับฉัน) นี่คือ EditView แบบกำหนดเองที่ทำสิ่งนี้ (ไม่จำเป็นต้องใช้การทำคลาสย่อย แต่ฉันพบว่ามันสะดวกสำหรับวัตถุประสงค์ของฉันเพราะฉันต้องการคว้าโฟกัสเมื่อมองเห็นได้ด้วย)

นี่คือส่วนใหญ่เหมือนกับคำตอบ tidbecks จริง ๆ แล้วฉันไม่ได้สังเกตคำตอบของเขาเลยเพราะมีคะแนนโหวตเป็นศูนย์ จากนั้นฉันกำลังจะแสดงความคิดเห็นกับโพสต์ของเขา แต่มันคงจะนานเกินไปดังนั้นฉันจึงสิ้นสุดการโพสต์นี้ tidbeck ชี้ให้เห็นว่าเขาไม่แน่ใจว่ามันทำงานอย่างไรกับอุปกรณ์ที่มีคีย์บอร์ด ฉันสามารถยืนยันได้ว่าพฤติกรรมนั้นเหมือนกันทุกประการ การเป็นเช่นนั้นในโหมดแนวตั้งแป้นพิมพ์ซอฟต์แวร์จะโผล่ขึ้นมาและในแนวนอนก็ไม่ได้ การมีคีย์บอร์ดทางกายภาพเลื่อนออกมาหรือไม่สร้างความแตกต่างให้กับโทรศัพท์ของฉัน

InputMethodManager.SHOW_FORCEDเพราะผมเองพบพฤติกรรมอึดอัดเล็กน้อยฉันเลือกสำหรับการใช้: ทำงานได้ตามที่ฉันต้องการให้ทำงาน แป้นพิมพ์จะปรากฏโดยไม่คำนึงถึงทิศทางอย่างไรก็ตามอย่างน้อยบนอุปกรณ์ของฉันจะไม่ปรากฏขึ้นหากแป้นพิมพ์ฮาร์ดแวร์เลื่อนออก

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}

1

ปัญหาน่าจะเป็นไปได้ว่าตั้งแต่สถานที่ที่คุณป้อนข้อความที่ถูกซ่อนอยู่ในขั้นต้น (หรือซ้อนกันหรืออะไร) AlertDialog คือการตั้งธงโดยอัตโนมัติWindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMหรือWindowManager.LayoutParams.FLAG_NOT_FOCUSABLEเพื่อให้สิ่งที่ไม่ก่อให้เกิดการป้อนข้อมูลที่อ่อนนุ่มที่จะแสดงขึ้น

วิธีที่จะแก้ไขปัญหานี้คือการเพิ่มสิ่งต่อไปนี้:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

ลองใช้:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

1

ในการแสดงแป้นพิมพ์สำหรับฉันฉันต้องทำดังต่อไปนี้

Android TextField: ตั้งโฟกัส + ซอฟต์อินพุทแบบเป็นโปรแกรม

โดยพื้นฐานแล้วการแก้ปัญหามีดังต่อไปนี้

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

ที่ไหนShowKeyboardเป็น

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

หลังจากอินพุตสำเร็จฉันก็ต้องแน่ใจว่าได้ซ่อนแป้นพิมพ์

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1

ใส่วิธีการเหล่านี้ในชั้นเรียน Util ของคุณและใช้งานได้ทุกที่

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

ชวา

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

1

ฉันสร้างฟังก์ชันเสริม kotlin-esqe ที่ดีในกรณีที่ทุกคนสนใจ

fun Activity.hideKeyBoard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Activity.showKeyboard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

0

นี่คือตัวอย่างที่ดีสำหรับคุณ:

<?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:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>

0

ทำไมคำตอบนี้ - เพราะการแก้ปัญหาดังกล่าวข้างต้นจะแสดงแป้นพิมพ์ของคุณ แต่มันจะไม่หายไปถ้าคุณคลิกที่ใดก็ได้อื่น ๆ EditTextที่ ดังนั้นคุณต้องทำอะไรบางอย่างเพื่อให้แป้นคีย์หายไปเมื่อหมดEditTextโฟกัส

คุณสามารถทำได้โดยทำตามขั้นตอนต่อไปนี้:

  1. ทำให้มุมมองพาเรนต์ (มุมมองเนื้อหาของกิจกรรมของคุณ) สามารถคลิกได้และสามารถโฟกัสได้โดยการเพิ่มแอททริบิวต่อไปนี้

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. ใช้วิธีการ hideKeyboard ()

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. สุดท้ายตั้ง onFocusChangeListener edittext ของคุณ

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });

0

นี่เป็นเรื่องยุ่งยากเล็กน้อย ฉันทำอย่างนี้และมันได้ผล

1. โทรครั้งแรกเพื่อซ่อนซอฟต์อินพุทจากหน้าต่าง สิ่งนี้จะซ่อนอินพุตซอฟต์คีย์หากมองเห็นคีย์บอร์ดนุ่มนวลหรือไม่ทำอะไรเลยถ้าไม่มีคีย์บอร์ด

2. แสดงกล่องโต้ตอบของคุณ

3. จากนั้นเพียงโทรเพื่อสลับอินพุตอ่อน

รหัส:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);

0

ลองสิ่งนี้

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}

0

พยายามมาก แต่นี่คือสิ่งที่ทำงานสำหรับฉัน (kotlin):

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()

0

ดูที่https://stackoverflow.com/a/39144104/2914140ฉันลดความซับซ้อนลงเล็กน้อย:

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

มันดีกว่าhttps://stackoverflow.com/a/11155404/2914140 :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

เพราะเมื่อคุณกดปุ่มโฮมและย้ายไปที่หน้าจอหลักแป้นพิมพ์จะยังคงเปิดอยู่


-1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

ฉันเรียกสิ่งนี้ใน onCreate () เพื่อแสดงแป้นพิมพ์โดยอัตโนมัติเมื่อฉันเข้ามาในกิจกรรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.