วิธีแสดงคีย์บอร์ดนุ่มนวลเมื่อเน้น edittext


461

ฉันต้องการแสดงแป้นพิมพ์นุ่มโดยอัตโนมัติเมื่อมีการEditTextโฟกัส (หากอุปกรณ์ไม่มีแป้นพิมพ์กายภาพ) และฉันมีสองปัญหา:

  1. เมื่อฉันActivityแสดงขึ้นฉันEditTextจะโฟกัส แต่แป้นพิมพ์ไม่ปรากฏฉันต้องคลิกอีกครั้งเพื่อแสดงแป้นพิมพ์ (ควรปรากฏขึ้นเมื่อActivityแสดงขึ้น)

  2. และเมื่อฉันคลิกทำบนแป้นพิมพ์แป้นพิมพ์จะหายไป แต่EditTextยังคงโฟกัสอยู่และไม่ต้องการ (เพราะการแก้ไขของฉันเสร็จสิ้นแล้ว)

เพื่อดำเนินการต่อปัญหาของฉันคือการมีบางสิ่งที่เหมือนบน iPhone: ซึ่งทำให้การซิงค์แป้นพิมพ์กับEditTextสถานะของฉัน(เน้น / ไม่เน้น) และแน่นอนไม่ได้แสดงคีย์บอร์ดอ่อนหากมีอยู่จริง


ฉันเพิ่งมี EditText พื้นฐานเช่น: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> และในกิจกรรมของฉัน สิ่งนี้: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry

2
สิ่งนี้ช่วยให้ฉันดีกว่าคำตอบใด ๆ ในโพสต์นี้: stackoverflow.com/a/2418314/1491212
Armel Larcier

คำตอบ:


628

หากต้องการบังคับให้คีย์บอร์ดอ่อนปรากฏขึ้นคุณสามารถใช้

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

และสำหรับการลบโฟกัสEditTextนั้นน่าเศร้าที่คุณต้องมีหุ่นViewเพื่อจับโฟกัส

ฉันหวังว่านี่จะช่วยได้


เพื่อปิดคุณสามารถใช้

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

ใช้งานได้กับกล่องโต้ตอบ

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
ถ้าฉันทำสิ่งนี้แป้นพิมพ์นุ่มจะปรากฏขึ้นเมื่อกิจกรรมปรากฏขึ้น (มันดี) แต่เมื่อโฟกัสของฉันออกจาก EditText และไปที่ปุ่มเช่นนั้นแป้นพิมพ์จะยังคงอยู่ (ไม่ดี)
Ludovic Landry

157
ใช้งานไม่ได้กับ EditText ในกล่องโต้ตอบที่มีโฟกัสอยู่แล้ว ไม่แน่ใจว่าทำไม
Matthias

10
@AbdellahBenhammou อาจจะทำการร้องขอโฟกัสโทรไปที่ข้อความแก้ไขของคุณก่อนที่จะแสดงซอฟต์อินพุทอาจช่วยแก้ปัญหาของคุณได้ มันทำเพื่อฉัน
r1k0

18
@AbdellahBenhammou ทำสิ่งนี้ใน DialCFragment ของคุณใน onCreate (): getDialog (). getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ฟิลลิป

22
ทำงานร่วมกับyourEditText.requestFocus()ตามที่อธิบายไว้ที่นี่: stackoverflow.com/questions/8991522/…
Vivek Pandey

231

ผมมีปัญหาเดียวกัน. ทันทีหลังจากที่แก้ไขการมองเห็นข้อความเปลี่ยนจาก GONE เป็น VISIBLE ฉันต้องตั้งโฟกัสและแสดงคีย์บอร์ดนุ่ม ฉันทำได้โดยใช้รหัสต่อไปนี้:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

มันใช้งานได้สำหรับฉันที่มีความล่าช้า 100ms แต่ล้มเหลวโดยไม่ล่าช้าหรือมีความล่าช้าเพียง 1 มิลลิวินาที

ส่วนความเห็นของรหัสแสดงวิธีการอื่นซึ่งใช้งานได้กับอุปกรณ์บางอย่างเท่านั้น ฉันทดสอบกับระบบปฏิบัติการเวอร์ชั่น 2.2 (อีมูเลเตอร์), 2.2.1 (อุปกรณ์จริง) และ 1.6 (อีมูเลเตอร์)

วิธีการนี้ช่วยฉันเจ็บปวดได้มาก


48
ฉันไม่รู้ว่าจะมีอะไรน่าเกลียดและสวยงามในเวลาเดียวกัน ขอบคุณมาก!
mkerley

15
@jellyfish EditTextนี้จำลองแตะที่ สำหรับคนอื่นที่อ่านสิ่งนี้แทนที่จะสร้างใหม่Handlerคุณสามารถใช้View.postDelayed()วิธีนี้กับyourEditTextวิดเจ็ตได้
Tony Chan

5
นี่คือแฮ็ค - ทางออกที่ดีกว่ามากโดย David Chandler
Ben Bederson

4
หากโซลูชันของ David Chandler ทำงานได้กับทุกรุ่น / อุปกรณ์ Android และสำหรับกรณีที่การมองเห็นเปลี่ยนจาก GONE เป็น VISIBLE คุณต้องใช้โซลูชันแทน
Mike Keskinov

3
ตกลง คุณรู้วิธีแก้ปัญหาที่ดีกว่าซึ่งใช้งานได้กับทุกรสนิยม Android หรือไม่?
Mike Keskinov

162

ในการทำให้แป้นพิมพ์ปรากฏขึ้นให้ใช้

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

วิธีนี้มีความน่าเชื่อถือมากกว่าการเรียกใช้ InputMethodManager โดยตรง

เพื่อปิดให้ใช้

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

12
ใครช่วยอธิบายหน่อยได้InputMethodManagerไหมว่าทำไมเรื่องนี้ถึงเชื่อถือได้มากกว่าการเรียกใช้โดยตรง (สำหรับอันหนึ่งมันใช้งานไม่ได้ซึ่งต่างจากวิธีแก้ปัญหาของ raukodraug)
Matthew Quiros

5
ไม่ได้ผลสำหรับฉันเช่นกัน ทำงานบน Android 2.3.5 วิธีแก้ปัญหาของ raukodraug ใช้ได้สำหรับฉัน ค้นหาการอ้างอิงรุ่น แต่ไม่พบ
Hugo Logmans

2
สิ่งนี้ใช้ได้กับฉันใน Android 4.4.2 วิธีการ InputMethodManager เลือกให้เป็นวิธีแก้ปัญหาสำหรับโพสต์นี้ใช้ไม่ได้
Phil

หลังจากใช้วิธีการในคำตอบที่ฉันผนวกนี้และมันใช้งานได้ แต่ไม่ว่ามันจะไม่ทำงาน thanx
Manny265

2
ไม่ได้ผลสำหรับฉันใน Android 4.4.2 มันแสดงแป้นพิมพ์ แต่ไม่ได้ซ่อนไว้
John J Smith

87

เมื่อไม่มีสิ่งใดทำงานให้บังคับให้แสดง :

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

และหลังจากนั้นหากคุณต้องการปิดตัวอย่างเช่น onPause () คุณสามารถโทร:

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

4
คุณพูดถูก @Bolling! เมื่อไม่มีอะไรทำงานรหัสของคุณช่วยฉัน ขอบคุณ!
Willian Paixao

3
รหัสของคุณเป็นรหัสเดียวที่ทำงานให้ฉันและฉันลองทุกวิธีในหน้านี้! ขอบคุณมาก!
Mattia Ruggiero

4
อย่าบังคับมัน ในบางกรณีเมื่อคุณไปจากเบื้องหน้าไปยังพื้นหลังแป้นพิมพ์จะยังคงอยู่ที่นั่นเพราะคุณบังคับมัน มันเป็นปัญหาการกระจายตัวของ แต่ฉันได้เห็นมันในซัมซุง duos
j2emanue

ฉันมักจะมีรหัสเพื่อปิดแป้นพิมพ์ onPause () เนื่องจากฉันเห็นมันติดแม้ว่าคุณจะไม่ได้บังคับ
Bolling

มันใช้งานได้ แต่เมื่อย้ายไปที่หน้าจออื่นมันยังคงเปิดอยู่
Sithu

75

รหัสต่อไปนี้ถูกปล้นจากซอร์สโค้ด 4.1 ของ Google สำหรับ SearchView ดูเหมือนว่าจะทำงานได้ดีบน Android รุ่นที่น้อยกว่าเช่นกัน

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

จากนั้นจะต้องเพิ่มรหัสต่อไปนี้เมื่อสร้างการควบคุม / กิจกรรม (ในกรณีของฉันมันคือการควบคุมแบบคอมโพสิตแทนที่จะเป็นกิจกรรม)

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

ขอบคุณ! มันใช้งานได้ดีอย่างน่าอัศจรรย์ และเป็นวิธีการแก้ปัญหาที่ฉันคุ้นเคยกับคำตอบและหัวข้อทั้งหมดที่ฉันอ่านในเรื่องนี้
Rui

37
:-D setImeVisibility(hasFocus)?
แมทเทียส

ฉันลองใช้วิธีการนี้เนื่องจากจริง ๆ แล้ว "พลิกมุมมองการค้นหาของฉันเอง" (ไม่ต้องการทำอย่างนั้น แต่มีเหตุผล) สิ่งนี้ใช้ได้สำหรับฉันยกเว้นเมื่อเริ่มกิจกรรม ฉันเพิ่ม android: windowSoftInputMode = "alwaysVisible" กับกิจกรรมและมีการเรียก requestFocus () บนข้อความแก้ไขแล้ว ทำงานเหมือนแชมป์
javahead76

ความคิดใด ๆ ที่ต้องการ removeCallbacks (mShowImeRunnable)? ฉันคิดว่าเมื่อ runnable ถูกเลือกเพื่อรันจากคิวมันจะถูกลบออกจากคิวในเวลาเดียวกันด้วยหรือไม่
Cheok Yan Cheng

1
หลังจากลองหลายรูปแบบนี่เป็นสิ่งเดียวที่ทำงานได้อย่างสม่ำเสมอสำหรับฉัน (Android 4.42) ขอบคุณ
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" -> ในไฟล์รายการ

edittext.requestFocus(); -> ในรหัส

นี่จะเป็นการเปิดคีย์บอร์ดอ่อนที่ข้อความแก้ไขมีการร้องขอการโฟกัสเมื่อมีกิจกรรมปรากฏขึ้น


2
นี่เป็นการเปิดแป้นพิมพ์ที่การสร้างกิจกรรม
xpto

ไม่ตอบคำถาม แต่ช่วยให้ฉัน :)
S.Thiongane

เปิดกุญแจโดยไม่ต้องขอโฟกัสใน api 22
David

ทำงานได้ดีสำหรับกรณีของฉัน ฉันสงสัยว่าทำไมคุณลักษณะการขอโฟกัสเพียงแค่จาก XML ต้องมีการกล่าวถึงในmanifestเช่นกัน!
sud007

30

ฉันมีโชคเมื่อเร็ว ๆ นี้ในบางกรณีด้วยรหัสด้านล่าง ฉันยังไม่ได้ทดสอบทั้งหมด แต่ ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

และแป้นพิมพ์ลัดปรากฏขึ้น


สำหรับกรณีของฉันฉันมีปุ่มเพื่อเพิ่มข้อมูลเพิ่มเติม ในตัวจัดการ button.onClick โค้ดด้านบนได้รับการเพิ่มเพื่อบังคับให้คีย์บอร์ดนุ่มนวลปรากฏขึ้นสำหรับการป้อนข้อมูลที่เป็นตัวเลือก Droid 2.2.2
Dent

นี่เป็นทางออกที่ดี แต่อย่าลืมว่าคุณควรสร้างวัตถุ MotionEvent และโทรรีไซเคิล () กับพวกเขาหลังการใช้งานเพื่อให้ผู้โทรในภายหลังใช้ซ้ำ
jimbob

คุณเพียงแค่ต้องการ dispatchTouchEvent () พร้อม ACTION_UP เพื่อเป็นข้อโต้แย้ง ..
Mohammed Junaid

15

คุณสามารถลองบังคับให้แป้นพิมพ์นิ่มปรากฏขึ้นใช้งานได้สำหรับฉัน:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
สิ่งนี้ใช้งานได้สำหรับฉัน ... ฉันลองใช้ InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE) เหล่านี้แล้ว imm.showSoftInput (ชื่อ inputMethodManager.SHOW_IMPLICIT); หรือ getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); แต่ไม่มีใครทำงานได้
GünayGültekin

10

บางครั้งคำตอบของ raukodraug จะไม่ทำงาน ฉันทำอย่างนี้กับการทดลองและข้อผิดพลาด:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

และส่วนEditText :

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

1
นี่เป็นทางออกเดียวที่ทำงานกับฉันบน Android 5
user1021430

10

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

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

และเพื่อแสดงแป้นพิมพ์:

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

สำหรับ DialogFragment คุณสามารถเรียกนี้ในการแทนที่onStart()และคุณสามารถใช้เป็นทางเลือกให้กับgetDialog().getWindow() getActivity().getWindow()
Mr-IDE

10

และสำหรับ Kotlin เพียงใช้ส่วนขยายนี้:

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

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

สิ่งที่ฉันกำลังมองหา
lasec0203

8

สำหรับส่วนให้แน่ใจว่ามันทำงาน:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

showSoftInput ไม่ได้ทำงานให้ฉันเลย

ฉันคิดว่าฉันต้องตั้งค่าโหมดการป้อนข้อมูล: (ที่นี่ในองค์ประกอบกิจกรรมในรายการ)

android:windowSoftInputMode="stateVisible" 

6

เชื่อหรือไม่ว่าปัญหาของฉันกับ Soft Keyboard ได้รับการแก้ไขเมื่อฉันค้นพบว่าภาพเคลื่อนไหวของกิจกรรมสามารถปิดใช้งาน Soft Keyboard ได้ เมื่อคุณเรียกความตั้งใจด้วย

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

และ

overridePendingTransition(0, 0);

มันสามารถซ่อน Soft Keyboard และไม่มีทางที่จะแสดงมัน


6

ฉันมีปัญหาเดียวกันในสถานการณ์ที่แตกต่างกันและวิธีแก้ปัญหาที่ฉันพบว่าทำงานในบางส่วน แต่ไม่ทำงานในที่อื่นดังนั้นนี่คือโซลูชันรวมที่ทำงานในสถานการณ์ส่วนใหญ่ที่ฉันพบ:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

ฉันรวมทุกอย่างที่นี่และสำหรับฉันมันทำงาน:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

มันใช้งานได้สำหรับฉัน คุณสามารถลองใช้วิธีนี้เพื่อแสดงคีย์บอร์ด:

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

5

ข้อมูลโค้ด . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin ส่วนขยายสำหรับการแสดงคีย์บอร์ดบนโฟกัส

นี่คือการรวมกันของคำตอบก่อนหน้าซึ่งยาวเกินไปหรือไม่สมบูรณ์

ส่วนขยายนี้โพสต์ runnable บนคิวข้อความซึ่งแสดงคีย์บอร์ดนุ่มหลังจากขอโฟกัส:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

เรียกได้จากทุกมุมมองเมื่อต้องการในภายหลัง:

editText.showSoftKeyboard()


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

ภายในรายการของคุณ:

android:windowSoftInputMode="stateAlwaysVisible"- แป้นพิมพ์เปิดตัวครั้งแรก android:windowSoftInputMode="stateAlwaysHidden" - แป้นพิมพ์ที่ซ่อนเริ่มต้น

ฉันชอบที่จะใช้"adjustPan"เพราะเมื่อคีย์บอร์ดเปิดตัวหน้าจอจะปรับอัตโนมัติ

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

เพียงเพิ่มบรรทัดนี้ในมุมมอง EditText ของคุณ:

android:isScrollContainer="true"

และ TADA - คีย์บอร์ดเริ่มปรากฏขึ้นโดยอัตโนมัติ!

ฉันมีปัญหาที่คล้ายกันและค้นพบวิธีแก้ปัญหาที่เรียบง่ายและแปลกประหลาดนี้

ตามที่ได้รับการกล่าวถึงที่นี่โดยผู้ใช้ 3392439 การปรากฏตัวของแป้นพิมพ์เมื่อมุ่งเน้นไปที่การเชื่อมต่ออย่างมากกับ presense ขององค์ประกอบเลื่อนในไฟล์ XML

แม้การมีอยู่ของมุมมอง EditText อื่นซึ่งประกอบด้วยบรรทัดข้างต้นใน XML เดียวกันทำให้แป้นพิมพ์ปรากฏขึ้นไม่ว่า EditTexts ใดจะเน้นในขณะนี้

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

หากไม่มีการเลื่อน - คุณต้องคลิกที่ EditText เพื่อให้แป้นพิมพ์ปรากฏ


นี่เป็นสิ่งที่แปลกมาก แต่ก็ใช้งานได้ดี - ฉันพยายามทำrequesFocus()จากภายในตัวจัดการการคลิกและนี่เป็นวิธีเดียวที่นอกเหนือจากการแสดงอย่างชัดเจนซอฟท์แวร์ INput SHOW_FORCED
ดึง

ศักดิ์สิทธิ์ sh * t ขอบคุณคน ไม่มีเงื่อนงำว่าทำไมมันใช้งานได้ แต่ฉันได้ทำการทดสอบบนอุปกรณ์ 8 เครื่องจากผู้ผลิตหลายรายและใช้งานได้ทุกครั้ง!
Antonio Vlasic

3

โซลูชันทั้งหมดที่ระบุด้านบน ( การโต้ตอบInputMethodManagerในฟังก์ชั่น OnFocusChangeListener.onFocusChange ที่แนบกับEditTextของคุณจะทำงานได้ดีถ้าคุณมีการแก้ไขเพียงครั้งเดียวในกิจกรรม

ในกรณีของฉันฉันมีการแก้ไขสองอย่าง

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

ฉันสังเกตเห็นว่า onFocusChange นั้นถูกเรียกใช้สำหรับ tvX โดยมี hasFocus = true (แสดงแป้นพิมพ์) แต่สำหรับ tvY ที่มี hasFocus = true (ซ่อนแป้นพิมพ์) ในท้ายที่สุดแป้นพิมพ์ก็ไม่ปรากฏ

โซลูชันทั่วไปควรมีคำสั่งที่ถูกต้องหาก "แสดงแป้นพิมพ์หากข้อความ EditText มีโฟกัส"


3

ในส่วน onResume () ของกิจกรรมคุณสามารถเรียกเมธอด bringKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

อะไรWidgetUtils.showKeyboard? นั่นเป็นบิตที่สำคัญที่สุดที่นี่
TWiStErRob

2

ไม่มีคำตอบใดที่เหมาะกับฉัน นี่เป็นวิธีง่ายๆ

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

เพิ่งเลื่อนเมธอด requestFocus () ไปที่ 400ms


ขอบคุณมากมันต้องใช้เวลาในการแสดงคีย์บอร์ด ...
hkh114

1

ฉันค้นพบพฤติกรรมที่แปลกประหลาดเนื่องจากในหนึ่งในแอพของฉันคีย์บอร์ดนุ่มนวลจะแสดงโดยอัตโนมัติเมื่อเข้าสู่กิจกรรม (มี editText.requestFocus () ใน onCreate)

ในการขุดต่อไปฉันค้นพบว่าสิ่งนี้เป็นเพราะมี ScrollView อยู่รอบ ๆ เค้าโครง หากฉันลบ ScrollView การทำงานจะเป็นไปตามที่อธิบายไว้ในคำแถลงปัญหาดั้งเดิม: เฉพาะเมื่อมีการคลิก editText ที่โฟกัสไปแล้วเท่านั้นที่แป้นพิมพ์อ่อนจะปรากฏขึ้น

หากวิธีนี้ใช้ไม่ได้ผลให้ลองใส่ ScrollView ซึ่งไม่เป็นอันตราย


1

ผมมีปัญหาที่คล้ายกันโดยใช้มุมมองภาพเคลื่อนไหว ดังนั้นฉันจึงใส่ฟังแอนิเมชั่นเพื่อให้แน่ใจว่าฉันจะรอให้แอนิเมชั่นสิ้นสุดลงก่อนที่จะพยายามขอการเข้าถึงคีย์บอร์ดบน edittext ที่แสดง

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

ฉันเห็นด้วยกับ raukodraug สำหรับการใช้งานใน swithview คุณต้องขอ / ล้างโฟกัสเช่นนี้:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

ความนับถือ.

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