Android: odak bir EditText üzerindeyken yazılım klavyesini otomatik olarak göster


341

Kullanarak bir giriş kutusu gösteriyorum AlertDialog. EditTextİletişim içine kendisi dediğim zaman otomatik olarak odaklanılır AlertDialog.show(), ancak yumuşak klavye otomatik gösterilmez.

İletişim kutusu gösterildiğinde yazılım klavyesinin otomatik olarak nasıl gösterilmesini sağlayabilirim? (ve fiziksel / donanım klavyesi yoktur). Genel aramayı başlatmak için Ara düğmesine bastığım gibi, yazılım klavyesi otomatik olarak gösterilir.


1
Ted'in aşağıdaki yorumuna göre bu otomatik olarak gerçekleşmelidir . Önce kontrol edin!
Cheezmeister

Bu cevap en basit ve iyi çalışıyor: stackoverflow.com/a/8018630/89818
caw


1
Bu cevaba yıllar içinde birkaç kez geri döndüm. Her zaman bir Diyalog içinde bu sorun yaşıyorum, asla Parça veya Etkinlik.
tir38

Yanıtlar:


305

Sen odaklanmak dinleyici oluşturabilir EditTextüzerine AlertDialogdaha sonra almak, AlertDialog's Window. Oradan arayarak yumuşak klavye şovunu yapabilirsiniz setSoftInputMode.

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 kullanarak nasıl yapabilirim? ... son AlertDialog.Builder uyarısı = yeni AlertDialog.Builder (Main.this);
Stephen

6
@Stephen, iletişim kutusunu oluşturucu yerine iletişim kutusunda final AlertDialog dialog = builder.create()ve ardından kullanarak showoluşturucudan alabilirsiniz.
tidbeck

30
YUKARI YORUMUMU YENİDEN DOĞRUYORUM Odağı doğru alamazsanız XML'inize bir göz atın! Orada <requestFocus> </requestFocus> etiketini görüyorsanız kaldırın. Etiketin EditText'e odaklanacağı anlaşılıyor ve EditText'in zaten odağı olduğu için dinleyiciniz tetiklenmeyecek.
Ted

11
Cihazda donanım klavyesi varsa bunu nasıl yapmazsınız? Bu kullanıcılar için can sıkıcı görünüyor.
mxcl

8
Bunun neden SDK'daki varsayılan davranış olmadığını anlamıyorum. Metin girişi gerektiren bir görünüm yanıp sönen bir imleç gösteriyorsa, neden birisi metin girmek için klavyeyi görmek istemiyor? Bana bir UX çok yanlış geliyor
Christian García

240

Klavye kullanımını göstermek için:

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

Klavye kullanımını gizlemek için:

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

3
Bu, düzeninizdeki bir görünümün görünürlüğünü GÖRÜNÜR ve GON arasında değiştirmeye dayalı olarak yumuşak klavyeyi göstermek / gizlemek istediğinizde özellikle iyi çalışır.
PacificSky

38
Bunun yerine SHOW_IMPLICIT bayrağını kullanmanızı öneririm, çünkü etkinlik veya uygulamanın klavyeyi beklendiği gibi otomatik olarak gizleyeceği anlamına gelir.
drspaceboo

6
@drspaceboo SHOW_IMPLICIT kullanımı benim için hiç çalışmıyor, SHOW_FORCED kullanmalıyım, neden emin değilim ...
Yoann Hercouet

1
Yukarıdaki kod ne zaman çalıştırılmalıdır? Ebeveynime mizanpajımı ekledikten kısa bir süre sonra yapmayı denedim. Bu işe yaramadı. Ama düzen bir süre kaldıktan sonra yapsaydım işe yaradı. Peki bana "Şimdi klavyeyi göstermeye çalışırsanız, gerçekten işe yarayacak" diyen bir geri arama var mı?
William Jockusch

1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) yazılım klavyesini değiştirir. Klavyenin göründüğünden emin olmak istiyorsanız bunun yerine imm.showSoftInput (view, InputMethodManager.SHOW_IMPLICIT) kullanabilirsiniz; burada görünüm girişi alacak olan Görünümdür.
PJ_Finnegan

111

İletişim kutusunu oluşturduktan hemen sonra yumuşak bir klavye isteyebilirsiniz (SDK - r20 üzerinde test)

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

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

Merak eden herkes için, bu yöntem bir donanım klavyesi takıldığında yazılım klavyesini açmaz. Az önce bir USB On-The-Go kablosuyla test ettim. Mükemmel!
13rac1

Bu benim için hiçbir şey yapmaz.
JohnyTex

Donanım klavyem yok. Belki yapılandırma (?)
JohnyTex

25

Aynı sorunu yaşadım ve aşağıdaki kodla çözdüm. Donanım klavyeli bir telefonda nasıl davranacağından emin değilim.

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

Bu öyle Diyalog sınıf API düzeyinde 8.
tidbeck

daha sonra kaldırılmış olmalı: /
Jacek Kwiecień



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

veya

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

Teşekkürler çok dostum, bu harika, gerçek sorunumu çözmek için her ikisini de kullandım, kullanıcı ekleme modundaysa, etkinlik başlangıcında klavyeyi göstermesi gereken bir durum vardı ve güncelleme modu için klavye gerekli değildi varsayılan olarak. Böylece ben faaliyet için manifest içinde ben ayarlamak stateHiddenve kullanıcı yeni öğe oluştururken o zaman bahsettiğiniz kod satırını kullanarak klavye görüntüleniyor. :) Bir kez daha teşekkürler.
PHP Avenger

Bir 'getWindow () çözülemiyor' mesajı alıyorum. 'bunu' koymayı denedim. ve diğer şeylerden önce. sadece ekranın belirli bir bölümünü tıklayarak, bir düzenleme metni kullanmadan klavye almak istiyorum.
Androidcoder

1
@Androidcoder, Faaliyetin bir parçasıdır, bu yüzden benzer bir şey ekleyin ((Activity) context).getWindow().....
CoolMind

15

Diğer cevaplardan kod Snippet'ler iş, ama bir kullanıyorsanız, özellikle kod onları nereye yerleştirileceğini her zaman açık değildir AlertDialog.Builderve takip resmi iletişim öğretici o kullanmadığından final AlertDialog ...ya alertDialog.show().

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

Tercih edilir

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

SOFT_INPUT_STATE_ALWAYS_VISIBLE, odak EditText'ten uzaklaşırsa klavyeyi gizleyeceğinden, SHOW_FORCED, kullanıcı ana ekrana dönmesine veya son uygulamaları görüntülemesine rağmen klavyeyi açıkça kapatılana kadar görüntülenmeye devam edecektir.

Aşağıda, XML'de tanımlanan EditText özel bir düzen kullanılarak oluşturulan bir AlertDialog için çalışma kodu verilmiştir. Ayrıca klavyenin bir "git" tuşuna sahip olmasını sağlar ve pozitif düğmeyi tetiklemesini sağlar.

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

Bu oldukça eski bir yazı, yine de eklenecek bir şey var.
Bunlar klavyeyi kontrol altında tutmama yardımcı olan 2 basit yöntem ve sadece mükemmel çalışıyorlar:

Klavyeyi göster

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

Klavyeyi gizle

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

Nedir getCurrentFocus()?
CoolMind

Anlıyorum, bu bir Activity.
CoolMind

10

Yuku'nun çözümüne bazı ek bilgiler vereyim, çünkü bu çalışmayı zor buldum! AlertDialog nesnesini AlertDialog.Builder'ımdan nasıl alabilirim? Bu benim alert.show()infazımın sonucu :

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'yi manuel olarak gizlemeyi ve göstermeyi ele alan bu tartışmaya bir göz atın . Ancak, bir odak EditTextIME getirmiyorsa, çünkü ekran aslında sunulmadan önce uyandırdı AlertDialog.show()sizin OnCreate()veya veya başka bir yöntem çağırıyor olmasıdır. Bunu taşımak için OnPostResume()bu durumda düzeltmek gerektiğini düşünüyorum.


6

Evet setOnFocusChangeListenerbununla yapabilirsiniz size yardımcı olacaktır.

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

Bu sorunun eski olduğunu biliyorum, bir uzatma işlevini kullanmak, bir düzenleme metni için klavyeyi göstermenin daha güzel bir yolu olduğunu düşünüyorum

İşte bir düzenleme metni için klavyeyi göstermek için kullandığım yöntem.

kotlin kodu: sadece aramak gerekiredittext.showKeyboard()

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

java kodu:

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

Birisi aşağıdakileri alıyorsa:

Activity türünden getSystemService (String) statik olmayan yöntemine statik başvuru yapılamıyor

GetSystemService çağrısı için bağlam eklemeyi deneyin .

Yani

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

1

Asıl soru Diyaloglar ile ilgilidir ve EditText'im düzenli bir görünümdedir. Her neyse, bunun çoğunuz için de işe yarayacağından şüpheleniyorum. İşte benim için işe yarayan (yukarıda önerilen en yüksek puanlı yöntem benim için hiçbir şey yapmadı). İşte bunu yapan özel bir EditView (alt sınıflama gerekli değildir, ancak görünüm görünür hale geldiğinde de odak kapmak istediğim için amaçlarım için uygun buldum).

Bu aslında tidbecks cevabı ile büyük ölçüde aynı. Oyunun sıfır oyu olduğu için cevabını hiç fark etmedim. Sonra sadece yazısını yorumlamak üzereydim, ama çok uzun olurdu, bu yüzden bu yazıyı yine de bitirdim. tidbeck, klavyeye sahip cihazlarla nasıl çalıştığından emin olmadığına dikkat çekiyor. Her iki durumda da davranışın tamamen aynı göründüğünü doğrulayabilirim. Öyle ki, portre modunda yazılım klavyesi açılır ve manzarada öyle olmaz. Fiziksel klavyenin kayması veya kaymaması telefonumda bir fark yaratmıyor.

Çünkü ben şahsen biraz garip kullanıyorum tercih davranışı bulundu: InputMethodManager.SHOW_FORCED. Çalışmasını istediğim gibi çalışıyor. Klavye, yöne bakılmaksızın görünür hale gelir, ancak en azından cihazımda donanım klavyesi dışarı kaydırılmışsa açılmaz.

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

Sorun, metin girdiğiniz yer başlangıçta gizlendiğinden (veya iç içe veya başka bir şeyden), AlertDialog'un bayrağı otomatik olarak ayarlaması WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMya WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEda bir şeyin görünmesi için yumuşak bir girişi tetiklememesi gibi görünüyor.

Bunu düzeltmenin yolu aşağıdakileri eklemektir:

(...)
// 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

dene ve kullan:

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

1

Klavyeyi göstermek için, benim için aşağıdakileri yapmak zorundaydım

Android TextField: odak + yumuşak girişi programlı olarak ayarla

Esasen çözüm şudur:

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

nerede ShowKeyboardolduğunu

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

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

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

1

Bu yöntemleri Util sınıfınıza koyun ve her yerde kullanın.

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

1

Herkes ilgilenirse güzel kotlin-esqe uzatma fonksiyonları oluşturdum

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

Bu sizin için iyi bir örnek:

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

Neden bu cevap - Çünkü yukarıdaki çözüm klavyenizi gösterecektir, ancak başka bir yere tıklarsanız kaybolmaz EditText. Bu nedenle, EditTextodak kaybolduğunda keybaord'un kaybolması için bir şeyler yapmanız gerekir .

Aşağıdaki adımları uygulayarak bunu başarabilirsiniz:

  1. Aşağıdaki özellikleri ekleyerek üst görünümün (etkinliğinizin içerik görünümü) tıklanabilir ve odaklanabilir olmasını sağlayın

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. HideKeyboard () yöntemini uygulama

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. Son olarak, düzenleme metninizin onFocusChangeListener öğesini ayarlayın.

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

0

Bu biraz zor. Bu şekilde yaptım ve işe yaradı.

1. yumuşak girişi pencereden gizlemek için ilk çağrıda. Bu, yazılım klavyesi görünür olduğunda yazılım girişini gizler veya görünmüyorsa hiçbir şey yapmaz.

2. iletişiminizi gösterin

3.Sonra yumuşak girişi değiştirmek için arayın.

kod:

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

Bunu dene

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

Birçoğunu denedim ama bu benim için işe yaradı (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 bakarak Biraz basitleştirdim:

// 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 adresinden daha iyidir :

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

çünkü Ana Ekran düğmesine bastığınızda ana ekrana geçtiğinizde klavye açık kalacaktır.


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

Etkinliğe geldiğimde klavyeyi otomatik olarak göstermek için bunu onCreate () olarak adlandırıyorum.

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.