เปิดแป้นพิมพ์อ่อนโดยทางโปรแกรม


118

ฉันมีกิจกรรมที่ไม่มีวิดเจ็ตลูกสำหรับมันและไฟล์ xml ที่เกี่ยวข้องคือ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

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

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

ขอคำแนะนำหน่อย


สวัสดี vignesh แต่ต้องเปิดซอฟต์คีย์บอร์ดโดยไม่มี textView คืออะไร?
milind

จริงๆแล้วฉันพยายามใช้ตัวฟังหลักในกิจกรรมนั้นเพราะฉันต้องทำเช่นนั้น
Vignesh

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

สวัสดี Vinoth ฉันได้เปลี่ยนรหัสของฉันเหมือนกับที่โพสต์ DSouza และฉันได้อัปเดตคำถามของฉันด้วยดังนั้นโปรดตรวจสอบว่ามีอะไรที่ฉันต้องเปลี่ยนแปลงหรือไม่
Vignesh

คำตอบ:


146

ฉันใช้บรรทัดต่อไปนี้เพื่อแสดงซอฟต์คีย์บอร์ดด้วยตนเองภายในเหตุการณ์ onclick และมองเห็นคีย์บอร์ดได้

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

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


@YosiTaguri สง่างามกว่านี้มากหากคุณกำลังทำกิจกรรมต่างๆ แล้วเศษชิ้นส่วนล่ะ! +1 สำหรับทั้งสองคำตอบ
S.Thiongane

และถ้าคุณต้องเปิดแป้นพิมพ์ในกล่องโต้ตอบที่มีการแก้ไขข้อความ? ต้องทำอย่างไร?
seema

5
@Vignesh: คุณต้องให้ความล่าช้าประมาณ 500 มิลลิวินาทีในขณะที่เปิดแป้นพิมพ์หากคุณต้องการใช้รหัสนี้ในขณะที่เปิดกิจกรรม
Vinit Saxena

@vinitsaxena ขอบคุณสำหรับความคิดเห็นอันมีค่าของคุณ
Vignesh

ฉันไม่แน่ใจ แต่ฉันพยายามรับมุมมองใด ๆ เช่น TextView และต่อท้าย Listener เช่นนี้ myTextView.post (Runnable ใหม่ () {public void run () {// here your method}}); และเมื่อมุมมองนี้จะสร้างขึ้นหมายความว่าทุกหน้าจอที่มองเห็นได้ในขณะนี้คุณสามารถโทรหาอะไรก็ได้ที่คุณต้องการ
Aleksey Timoshchenko

121

ในไฟล์รายการของคุณให้ลองเพิ่มสิ่งต่อไปนี้ในสิ่ง<activity>ที่คุณต้องการให้แสดงแป้นพิมพ์เมื่อกิจกรรมเริ่ม:

android:windowSoftInputMode="stateVisible"

สิ่งนี้จะทำให้แป้นพิมพ์ปรากฏขึ้นเมื่อเริ่มกิจกรรม

สำหรับตัวเลือกเพิ่มเติมเช็คเอาเอกสาร


3
หวังว่าฉันจะโหวตให้บ่อยขึ้นสำหรับคำตอบนี้เพียงเพื่อให้แฮ็กสกปรกทั้งหมดเหล่านั้นไปที่ด้านล่างของหน้า;)
fjdumont

คุณทำแบบเป็นโปรแกรมได้อย่างไร? ฉันต้องการให้แป้นพิมพ์แสดงโดยอัตโนมัติในบางสถานการณ์เท่านั้น
phreakhead

1
ฉันมีโต้ตอบการป้อนข้อมูลเช่นการเชื่อมโยงนี้การเชื่อมโยงวิธีการแสดงแป้นพิมพ์ไม่ได้กับกิจกรรม แต่ในพรอมต์? สิ่งนี้ได้ผลขอบคุณ <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); ถ้า (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
แชร์

7
เขาพูดว่า "โดยทางโปรแกรม"
Mert Akcakaya

2
มันไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำ: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

โปรดปฏิบัติตามรหัสด้านล่าง เรามั่นใจว่าปัญหาของคุณจะได้รับการแก้ไข

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

สวัสดีฉันเพิ่งวางรหัสของคุณในฟังก์ชัน onCreate แต่ยังไม่มีการเปลี่ยนแปลงในกิจกรรมของฉันถ้าคุณต้องการให้ฉันวางรหัสฉันจะวางในความคิดเห็น
Vignesh

เมื่อคุณต้องการเข้าถึงซอฟต์คีย์บอร์ดโปรดบอกฉันเพื่อให้ฉันแก้ไขปัญหาของคุณ กรุณาส่งรหัส .... ถ้าเป็นไปได้
AndroidDanger

ฉันต้องการตั้งค่า onKeyboardActionListener สำหรับกิจกรรมของฉันซึ่งไม่มีอะไรอื่นนอกจากเค้าโครงเชิงเส้น
Vignesh

เพียงแค่เห็นคำถามของฉันด้านบนซึ่งฉันได้แก้ไขโค้ดด้วยสิ่งที่คุณให้ไว้
Vignesh

กิจกรรมนี้มีไว้สำหรับการทำงานของแป้นพิมพ์เท่านั้นฉันต้องการฟังแต่ละปุ่มที่กด (โดยใช้ onKeyboardActionListener) และฉันจะส่งต่อไปยังเซิร์ฟเวอร์ภายในพร้อมกัน
Vignesh

25

นี่คือการทำงาน

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

หรือ

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

2
ขอขอบคุณสำหรับวิธีการตั้งค่าแบบเป็นโปรแกรมซึ่งใช้งานได้ในขณะที่แฮ็ก InputMethodManager ไม่ทำงาน
Martin Vysny

17

สิ่งที่ฉันต้องการคือการเปิดเผยแป้นพิมพ์ในช่วงเวลาที่แม่นยำมาก สิ่งนี้ได้ผลสำหรับฉัน! ขอบคุณ Benites

    private Handler mHandler= new Handler();

และในช่วงเวลาที่แม่นยำมาก:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

วิธีนี้ใช้ได้ผลสำหรับฉันใน onResume () โดยมีการปรับเปลี่ยนเล็กน้อยในการชะลอการดำเนินการโพสต์: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
ฉันขอแนะนำให้วางไว้ในการโทรกลับของ ViewTreeObserver เพื่อให้เรียกใช้ในเค้าโครงแรกเพื่อหลีกเลี่ยงการรอเป็นเวลาโดยพลการ ควรปลอดภัยกว่า / ตอบสนองได้ดีกว่า
Gabriel

เพียงวิธีนี้ใช้ได้ผลสำหรับฉัน ฉันมีวิธีการก่อนหน้านี้ที่ใช้งานได้ แต่น่าเสียดายสำหรับระบบปฏิบัติการล่าสุดตัวจัดการเป็นโซลูชันที่ใช้งานได้
นพ. Shafiul Alam Biplob

12

ฉันได้ใช้บรรทัดต่อไปนี้เพื่อแสดงซอฟต์คีย์บอร์ดด้วยตนเองภายในเหตุการณ์ onclick

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

ใส่ในเมธอด onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

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


1
ฉันมี SearchView ใน DialogFragment และเป็นครั้งแรกที่ Dialog ปรากฏขึ้น SearchView มีโฟกัส ... แต่แป้นพิมพ์ไม่ขึ้นเว้นแต่ผู้ใช้จะแตะมัน เราพยายามแค่ใช้ showSoftInput และ toggleSoftInputFromWindow จาก OnResume ALONE ... หรือแม้แต่ใน OnFocusChangeListener สำหรับ SearchView ... ในที่สุดการใช้กิจกรรมโพสต์นี้ใน OnResume ก็แก้ไขได้
โรคเรื้อน

8

ดูเหมือนว่าจะใช้งานได้

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

ดูเหมือนว่าจะทำงานได้ดีขึ้น: ในรายการ:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

ดูเหมือนว่าไฟล์ Manifest ทำงานใน Android 4.2.2 แต่ไม่ทำงานใน Android 4.0.3


8

ในเมธอด onCreateของกิจกรรมหรือonActivityCreated of a fragment

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

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

ในรายการ:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

ใน XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

ฉันคิดว่านี่จะช่วยให้ผู้อื่นประหยัดเวลาในการค้นหาปัญหานี้


ใช้งานได้ แต่แป้นพิมพ์จะยังคงมองเห็นได้แม้ว่าคุณจะออกจากแอปและเมื่อคุณปิดแป้นพิมพ์หากคุณเปิดแอปอีกครั้งแป้นพิมพ์จะไม่ปรากฏขึ้น
nulll

จนถึงตอนนี้ฉันไม่ประสบปัญหานี้ ฉันคิดว่าเป็นปัญหาของอุปกรณ์
Noundla Sandeep

ทำไมต้องจับเวลา? เพิ่มลิงค์เพื่อลงลึกได้ไหม
nulll

6

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);
}


3

ฉันใช้มันเป็นซิงเกิลตันเช่น:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

ใช้ในกิจกรรมของคุณเช่น:

showSoftKeyboard(this, yourEditTextToFocus);

ขอบคุณมากสำหรับการรวมข้อมูลสั้น ๆ เกี่ยวกับวิธีการใช้ฟังก์ชันและฟังก์ชัน มันทำงานได้ตรงตามที่ฉันต้องการ!
Chad Wilson

3

ใช้งานได้:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

และคุณเรียกวิธีนี้ว่า:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED ไม่ใช่ทางเลือกที่ดี หากคุณใช้การตั้งค่านี้คุณควรจัดการการซ่อนสถานะแป้นพิมพ์ ข้อเสนอแนะของฉันเป็นเช่นนี้

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

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ InputMethodManager.SHOW_IMPLICIT และ SHOW_FORCED; InputMethodManager


2
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

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

1

นี่คือซอร์สโค้ดที่จำเป็น:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

สำหรับรายละเอียดโปรดไปที่ลิงค์นี้ สิ่งนี้ช่วยฉันได้ https://github.com/Nikhillosalka/Keyboard/blob/master/README.md



1

คล้ายกับคำตอบของ @ShimonDoodkin นี่คือสิ่งที่ฉันทำในส่วน

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

ที่ไหนShowKeyboardเป็น

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        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);

0

มีคำตอบมากเกินไปอยู่แล้ว แต่ไม่มีอะไรได้ผลสำหรับฉันนอกเหนือจากนี้

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

ฉันใช้showSoftInputกับSHOW_FORCED

และกิจกรรมของฉันมี

 android:windowSoftInputMode="stateVisible|adjustResize"

หวังว่านี่จะช่วยใครสักคน


0

โพสต์วิธีนี้ในกิจกรรมฐานของคุณและใช้เป็นกิจกรรมอื่น ๆ เช่นเสน่ห์

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.