ฉันจะตั้งค่าโฟกัส (และแสดงแป้นพิมพ์) บน EditText ของฉันทางโปรแกรมได้อย่างไร


180

ฉันมีเลย์เอาต์ที่มีบางมุมมองเช่นนี้:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

ฉันจะกำหนดโฟกัส (แสดงแป้นพิมพ์) บนEditTextโปรแกรมของฉันได้อย่างไร

ฉันได้ลองแล้วมันใช้งานได้เฉพาะเมื่อฉันเปิดใช้งานActivityตามปกติ แต่เมื่อฉันเปิดใช้งานใน a TabHostมันไม่ทำงาน

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


คำตอบ:


352

ลองสิ่งนี้:

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

http://developer.android.com/reference/android/view/View.html#requestFocus ()


อัปเดตด้วยรหัสเพื่อบังคับให้แป้นพิมพ์แสดงจากคำตอบนี้: stackoverflow.com/questions/5105354/…
David Merriman

5
มันจะทำงานได้ก็ต่อเมื่อฉันเปิดกิจกรรมตามปกติ แต่เมื่อฉันเปิดกิจกรรมบน TabHost มันไม่ทำงาน
Houcine

27
มันใช้งานไม่ได้ อันนี้ใช้ได้กับฉัน InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
GünayGültekin

5
"นี่มันใช้ไม่ได้กับพี่ชาย" ในบางกรณีคุณต้องเรียกรหัสนี้แบบอะซิงโครนัสจาก postDelayed () ฉันมีกรณีเมื่อฉันต้องเปิดแป้นพิมพ์หลังจากผู้ใช้กด "ตกลง" ในกล่องโต้ตอบ และเมื่อปิดกล่องโต้ตอบมันก็ยุ่งกับโฟกัส ดังนั้นฉันจึงเรียกรหัสข้างต้นจาก postDelayed () มันดำเนินการหลังจากปิดกล่องโต้ตอบ กำไร.
Danylo Volokh

2
237 โหวตขึ้นกับคำตอบและ 62 ใน "มันใช้งานไม่ได้กับพี่ชาย" it ฉันทดสอบเพื่อให้ได้ความเห็นของตัวเองและใช้งานได้สมบูรณ์แบบ!)
Daniel

165

ใช้:

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

20
หลังจากลองใช้วิธีอื่นมากกว่า 5 วิธีนี่เป็นวิธีเดียวที่ใช้ได้ผลสำหรับฉัน (จากViewคลาสย่อย)
William

13
คำแนะนำนี้นำไปสู่การแก้ไขแป้นพิมพ์แม้ว่าเมื่อฟิลด์โฟกัสไม่ครบ
จนถึง

2
ใช่มันเหมาะกับฉันด้วยและimm.showSoftInput()ไม่ได้ผล
Spark.Bao

8
ในขณะที่วิธีนี้ใช้งานได้มันมีข้อเสียการเลิกใช้แอปพลิเคชันด้วยปุ่มโฮม (ฮาร์ดแวร์) จะทำให้แป้นพิมพ์บนหน้าจอ คุณจะต้องกดปุ่มย้อนกลับ (ฮาร์ดแวร์) เพื่อซ่อนคีย์บอร์ดดูหมิ่นว่าไม่มีประโยชน์บนหน้าจอหลักของคุณ
Adrien Horgnies

วิธีการอื่นไม่ได้ผลสำหรับฉันวิธีนี้ทำได้ ขอบคุณ.
Iman Akbari

53

สิ่งนี้ได้ผลสำหรับฉันขอบคุณungalcrys

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

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

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

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

2
ทางออกเต็มรูปแบบเท่านั้น ขอบคุณ
korro

41

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

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

หวังว่าจะช่วยได้!


5
นี่เพิ่งแสดงแป้นพิมพ์เมื่อเริ่มกิจกรรม
William

1
ยอดเยี่ยม :) ลองใช้คำตอบมากมาย แต่ด้วยสิ่งนี้ฉันสามารถทำให้มันใช้ได้ :) ขอบคุณมาก
Srikanth

คำตอบที่ไม่ค่อยมีคำตอบ
Avinash R

คำตอบที่สมบูรณ์แบบ ทำงานกับ "editText.requestFocus ()" เท่านั้น ขอบคุณ
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
ฉันต้องทำสิ่งนี้เพื่อให้มันปรากฏใน onResume () โดยไม่มีความล่าช้าไม่มีอะไรเกิดขึ้นกับทุกโซลูชันเดียวที่อธิบายไว้ในชุดข้อความนี้
FranticRock

1
นั่นไง นั่นคือคำตอบที่ฉันต้องการ แม้ว่าคุณไม่จำเป็นต้องล่าช้าทั้งวินาที ฉันลองแค่ 150 มิลลิวินาทีและมันก็ใช้ได้ดีเช่นกัน
ยางพารา

1
ขอบคุณ! สามารถใช้งานได้เป็นเวลา 0 มิลลิวินาที ( tb.post({ showKeyboard(tb) })) โปรดสังเกตว่าเราต้องการมุมมอง EditText ( tb) ไม่ใช่มุมมองส่วน
CoolMind

16

นี่คือวิธีการขยาย kotlin สำหรับการแสดงและซ่อนคีย์บอร์ดนุ่ม:

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

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

จากนั้นคุณสามารถทำสิ่งนี้:

editText.showKeyboard()
// OR
editText.hideKeyboard()

นี่เป็นทางออกที่ดีกว่าเมื่อเทียบกับการพัก
d-feverx

5

ฉันแนะนำให้ใช้LifecycleObserverซึ่งเป็นส่วนหนึ่งของการจัดการวงจรชีวิตด้วยคอมโพเนนต์ Lifecycle-Awareของ Android Jetpack

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

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

จากนั้นกำหนด LifecycleObserver ซึ่งเปิดและปิดคีย์บอร์ดเมื่อกิจกรรม / แฟรกเมนต์มาถึงonResume()หรือonPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

จากนั้นเพิ่มบรรทัดต่อไปนี้ลงในแฟรกเมนต์ / กิจกรรมใด ๆ ของคุณคุณสามารถใช้ LifecycleObserver ได้ตลอดเวลา เช่นสำหรับชิ้นส่วน:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

นี่คือ KeyboardHelper Class สำหรับการซ่อนและแสดงคีย์บอร์ด

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

วิธีแรก :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

วิธีที่สอง :

ในรายการ:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

ในรหัส:

etPassword.requestFocus();

0

ฉันลองหลายวิธีและมันใช้งานไม่ได้ไม่แน่ใจเพราะฉันใช้การเปลี่ยนแปลงที่ใช้ร่วมกันตั้งแต่ส่วนหนึ่งไปจนถึงกิจกรรมที่มีข้อความแก้ไข

Btw ข้อความที่ฉันอ่านจะถูกห่อด้วย LinearLayout

ฉันเพิ่มความล่าช้าเล็กน้อยเพื่อขอโฟกัสและรหัสด้านล่างทำงานให้ฉัน: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

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

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

ฉันไม่สามารถรับคำตอบเหล่านี้เพื่อทำงานด้วยตัวเอง ทางออกสำหรับฉันคือการรวมพวกเขา:

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

ฉันไม่แน่ใจว่าทำไมถึงเป็นสิ่งจำเป็นสำหรับฉัน - ตามเอกสารดูเหมือนว่าวิธีการอย่างใดอย่างหนึ่งควรจะทำงานได้ด้วยตัวเอง


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