Yazılım klavyesini programlı olarak aç


117

Alt bileşen içermeyen bir etkinliğim var ve karşılık gelen xml dosyası,

<?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>

ve etkinlik başlarken yazılım klavyesini programlı olarak açmak istiyorum. ve şimdiye kadar denediğim şey,

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

Bana biraz rehberlik et.


merhaba vignesh ama herhangi bir textView olmadan yazılım klavyesini açma ihtiyacı nedir?
milind

Aslında bu aktivitede anahtar dinleyici kullanmaya çalışıyorum, çünkü bunu yapmam gerekiyor.
Vignesh

Yaptığın şey doğrudur. Klavyeyi neden görmediğinizden emin değilim. Bu kodu, bir editText üzerinde herhangi bir kullanıcı eylemi olmadan klavyeyi başlatmak için bir kez kullandım ve başarılı oldu.
Vinoth

Merhaba Vinoth, Kodumu tıpkı DSouza'nın gönderdiği gibi değiştirdim ve sorumda da güncelledim, bu yüzden değiştirmem gereken herhangi bir şey olup olmadığını kontrol edin.
Vignesh

Yanıtlar:


146

Yazılım klavyesini onclick olayında manuel olarak görüntülemek için aşağıdaki satırları kullandım ve klavye görünür durumda.

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

Ancak etkinlik açılırken bunu hala açamıyorum, bunun için herhangi bir çözüm var mı?


@YosiTaguri, aktivitelerle uğraşıyorsanız çok daha şık. Peki ya parçalar? Her iki cevap için +1
S.Thiongane

ve ya metin düzenleme içeren iletişim kutusundaki klavyeyi açmanız gerekirse? Bu nasıl yapılır?
seema

5
@Vignesh: Aktiviteyi başlatırken bu kodu uygulamak istiyorsanız, klavyeyi açarken 500 milisaniye gibi biraz gecikme vermeniz gerekir.
Vinit Saxena

@vinitsaxena Değerli yorumunuz için teşekkür ederiz
Vignesh

emin değilim ama herhangi bir görünüm almayı denedim, örneğin TextView ve buna benzer bir dinleyici eklemeye çalıştım myTextView.post (new Runnable () {public void run () {// here your method}}); ve bu görünüm oluşturulduğunda bu, tüm ekranın görünür olduğu anlamına gelir, artık istediğinizi arayabilirsiniz
Aleksey Timoshchenko

121

Bildirim dosyanızda, <activity>etkinlik başladığında klavyeyi göstermek istediğinize aşağıdakileri eklemeyi deneyin :

android:windowSoftInputMode="stateVisible"

Bu, etkinlik başladığında klavyenin görünür olmasına neden olmalıdır.

Daha fazla seçenek için belgelere bakın .


3
Keşke tüm bu kirli saldırıları sayfanın altına getirmek için bu yanıta daha sık oy verebilseydim;)
fjdumont

Bunu programlı olarak nasıl yaparsınız? Klavyenin yalnızca belirli durumlarda otomatik olarak görünmesini istiyorum.
phreakhead

1
ben bu bağlantı gibi girdi diyalog içinde olan bağlantısını değil aktivitesi üzerine ancak istemi klavyeyi göstermek için nasıl? bu işe yaradı, teşekkürler <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); eğer (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
"Programlı" diyor.
Mert Akçakaya

2
Benim için çalışmıyor. Bunun yerine, şunu yapar: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

Lütfen aşağıdaki kodu takip edin. Eminim sorunun çözülecektir.

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

Merhaba, kodunuzu az önce onCreate işlevinin içine yapıştırdım ancak yine de etkinliğimde bir değişiklik yok, kodu yapıştırmamı isterseniz, yorum ekleyeceğim.
Vignesh

Yazılım klavyesine erişmek istediğinizde lütfen sorununuzu çözebilmem için bana söyleyin. Lütfen bana kodu gönderin .... mümkünse
AndroidDanger

Doğrusal düzenden başka hiçbir şeye sahip olmayan etkinliğim için onKeyboardActionListener'ı ayarlamak istiyorum.
Vignesh

Kodu benim için sağladığınızla düzenlediğim yukarıdaki soruma bakın.
Vignesh

Bu etkinlik yalnızca klavye eylemi içindir, basılan her tuşu dinlemek istiyorum (onKeyboardActionListener kullanarak) ve aynı anda yerel sunucuya
ileteceğim

25

Bu işler

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

veya

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

2
Bunu ayarlamanın programlı yolu için teşekkürler - bu işe yararken, InputMethodManager korsanları işe yaramıyor.
Martin Vysny

17

Tek ihtiyacım olan şey klavyeyi çok kesin bir anda ortaya çıkarmaktı. Bu benim için çalıştı! Teşekkürler Benites.

    private Handler mHandler= new Handler();

Ve çok kesin bir anda:

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

Bu çözüm benim için onResume () içinde, post eylemini geciktirme konusunda küçük bir değişiklikle çalıştı: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Bunu bir ViewTreeObserver geri aramasına koymanızı tavsiye ederim, böylece keyfi bir süre beklemek zorunda kalmamak için ilk düzende çağrılır. Daha güvenli / daha duyarlı olmalı.
Gabriel

Sadece bu çözüm benim için çalıştı. Daha önce işe yarayan önceki yöntemlerim vardı, ancak ne yazık ki en son işletim sistemi için, işleyici uygulanabilir bir çözümdür.
MD. Shafiul Alam Biplob

12

Yazılım klavyesini onclick olayında manuel olarak görüntülemek için aşağıdaki satırları kullandım.

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

Bunu onResume yöntemine koyun:

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 gereklidir, çünkü işletim sistemi onResume yöntemini çalıştırdığında, tüm görünümlerin çekildiğinden emin olamazsınız, bu nedenle kök düzeninizden çağrılan post yöntemi, her görünümün hazır olmasını bekletir.


1
Bir DialogFragment içinde bir SearchView vardı ve Dialog ilk geldiğinde SearchView odağına sahipti ... ama kullanıcı dokunmadıkça klavye AÇIK OLMADI. Sadece showSoftInput'u ve ayrıca OnResume ALONE'dan toggleSoftInputFromWindow'u kullanmaya çalışıyorduk ... hatta SearchView için OnFocusChangeListener'de ... ama bunların hiçbiri işe yaramadı çünkü pencere açılmadan ve çizilmeden önce ateşleniyormuş gibi görünüyorlar ..... .onResume'daki bu gönderi olayını kullanmak nihayet çözdü.
lepert

8

bu çalışıyor gibi görünüyor

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

bu daha iyi çalışıyor gibi görünüyor: açıkça:

<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>

Android 4.2.2'de çalışan ancak android 4.0.3'te çalışmayan manifest görünüyor


8

içinde onCreate aktivitesinin yöntemi veya onActivityCreated bir fragmanının

....
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

Yumuşak klavyeyi programlı olarak göstermek için böyle kullandım ve bu, klavyeyi başlatırken ekranın otomatik olarak yeniden boyutlandırılmasını önlemek için benim için çalıştı.

Açıkça:

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

XXXActvity'de:

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

Bunun başkalarına bu sorunu aramak için zaman kazandıracağını varsayıyorum.


Çalışır, ancak klavye uygulamadan çıksanız bile görünür kalır ve klavyeyi kapattığınızda uygulamayı tekrar açarsanız klavye görünmez
nulll

Şimdiye kadar bu problemle karşılaşmadım. Cihaz sorunu olduğunu varsayıyorum.
Noundla Sandeep

Zamanlayıcı neden gerekli? Daha derine inmek için bağlantılar ekleyebilir misiniz?
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)
}

Java

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
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

Bunu singleton gibi kullandım:

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

Bunu aktivitenizde kullanın:

showSoftKeyboard(this, yourEditTextToFocus);

İşlevin kendisinin yanı sıra işlevin nasıl kullanılacağına dair kısa bir pasaj eklediğiniz için çok teşekkür ederiz. Tam olarak ihtiyacım olduğu gibi çalışıyor!
Chad Wilson

3

Bu çalışıyor:

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

Ve bu yöntemi şöyle adlandırıyorsunuz:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED iyi bir seçim değil. Bu ayarı kullanırsanız, klavye durumunu gizlemeyi yönetmelisiniz. Benim önerim şöyle;

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

Ayrıca, parametreler alarak görünüme (genellikle EditText) odaklanabilirsiniz. Bu onu daha kullanışlı bir işlev yapar

InputMethodManager.SHOW_IMPLICIT ve SHOW_FORCED hakkında daha fazla bilgi için; InputMethodManager


1

Bu gerekli kaynak kodudur:

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

Ayrıntılar için lütfen bu bağlantıya gidin. Bu bana yardımcı oldu. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

Soft Keyboard'u açmak için onResume () 'de yukarıdaki kodu kullanın


1

@ShimonDoodkin cevabına benzer şekilde bir parçada yaptığım şey buydu.

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

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

nerede ShowKeyboardolduğunu

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

Başarılı bir girişten sonra klavyeyi gizlediğimden de emin oluyorum

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

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

0

Zaten çok fazla cevap var ama bunun dışında benim için hiçbir şey işe yaramadı

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

kullandım showSoftInput ileSHOW_FORCED

Ve benim faaliyetim

 android:windowSoftInputMode="stateVisible|adjustResize"

umarım bu birine yardımcı olur


0

Bu yöntemi temel etkinliğinizde yayınlayın ve bir cazibe gibi diğer etkinliklerde kullanın

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.