Edittext'deyken tuş takımı açılır penceresini nasıl devre dışı bırakabilirim?


85

Uygulamamda, tüm ekranlarımın ilk görünümü bir EditText, yani bir ekrana her gittiğimde ekrandaki tuş takımı açılıyor. Bu açılır pencereyi nasıl devre dışı bırakabilirim ve EditText'e manuel olarak tıklandığında etkinleştirebilirim ????

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

xml kodu:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

üçüncü görünüm (Metni Düzenle) odağın olduğu yerdir.


xml kodunuzu eksiksiz bir şekilde gönderebilirsiniz.
user1213202

Yanıtlar:


178

En iyi çözüm Proje Manifest dosyasında (AndroidManifest.xml) yatıyor , activityyapıya aşağıdaki özniteliği ekleyin

android: windowSoftInputMode = "stateHidden"


Misal:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

Açıklama:

  • Sanal klavyenin durumu - ister gizli ister görünür olsun - etkinlik kullanıcının dikkatinin odağı haline geldiğinde.
  • Aktivitenin ana penceresine yapılan ayarlama - ister sanal klavyeye yer açmak için küçültülmesi, ister pencerenin bir kısmı sanal klavye tarafından kapatıldığında mevcut odağı görünür kılmak için içeriğinin kaydırılması.

Tanıtımı:

  • API Seviye 3.

Dokümanlara Bağlantı

Not: Burada ayarlanan değerler ("stateUnspecified" ve "AdjustUnspecified" dışında), temada ayarlanan değerleri geçersiz kılar.


3
Aktivitede, bazıları için klavye olmasını istediğiniz, diğerleri için istemediğiniz metin alanları karışımı varsa, bu yaklaşım başarısız olur. Böyle bir senaryoda metin başına alan temelinde bunun nasıl başarılabileceğine dair cevabımı görün.
slogan621

@ slogan621Lütfen buradaki soruyu anlamak için bir dakikanızı ayırın. Farklı bir teğet üzerindesiniz!
Skynet

83

EditText'in üzerinde 'sahte' odak alan bir görünüm oluşturmalısınız:

Gibi bir şey :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

Bu durumda, odağı istemek için bir LinearLayout kullandım. Bu yardımcı olur umarım.

Bu mükemmel çalıştı ... Zaggo0 sayesinde


26
Yararsız bir görünüm eklemek, Aktivitenin bildirim girişine android: windowSoftInputMode = "stateHidden" eklemeye kıyasla, optimal olmayan bir çözümdür.
Chris Horner

@ChrisHorner her ikisinde de aktivite veya düzen için belirtmeniz gerekiyor ... aynı sinir bozucu şey .. her ikisi de bu çözüm için iyi çalışıyor.
Nicolas Jafelle

2
Tüm çözümü denedim ve bu düzgün çalışan tek çözüm! açık ve basit bir şekilde teşekkürler
alfo888_ibg

@ChrisHorner'in dediği gibi, işe yaramaz bir görünüm eklemek iyi bir fikir değildir, onun önerdiği gibi Manifest dosyasına bir öznitelik ekleyin veya bu kod satırını etkinliğinize ekleyin InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9

1
Görünüm hiyerarşisinin çok kötü bir uygulaması! Mümkünse bundan kaçınılması gerektiğini düşünüyorum.
sud007

43
     edittext.setShowSoftInputOnFocus(false);

Artık istediğiniz herhangi bir özel klavyeyi kullanabilirsiniz.


Teşekkürler, burada benim için çalışan tek çözüm bu + kısa ve kolay.
Max O.

20
API seviyesi 21'den itibaren mevcut
Jithu PS

Aradığım buydu.
Sanjay Joshi

@ JithuP.S, API seviyesi 19 olan Karbon titanyum üzerinde neden çalışıyor ??
尤金寶 漢子

23

İnsanlar burada birçok harika çözüm önerdiler, ancak bu basit tekniği EditText'imle kullandım (java ve AnroidManifest.xml'de hiçbir şey gerekmez). Odaklanabilir ve focusableInTouchMode'unuzu doğrudan EditText'te false olarak ayarlayın.

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

Buradaki amacım, bu düzenleme kutusunu, kullanıcıdan PIN'i girmesini istediğim ve özel PIN pedimi göstermek istediğim Uygulama kilidi etkinliğinde kullanmaktır. Android Studio 2.1'de minSdk = 8 ve maxSdk = 23 ile test edildi

görüntü açıklamasını buraya girin



20

Aktivite sınıfınıza aşağıdaki kodu ekleyin.

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

Kullanıcı EditText'i tıkladığında klavye açılır.


10

Ekran Klavyesini devre dışı bırakmak için aşağıdaki kodu kullanabilirsiniz.

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

1
ve EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) veya bunun gibi bir şeyi kullanarak tekrar etkinleştirebilirim ??
Karasinek

8

İki Basit Çözüm:

İlk Çözüm , manifest xml dosyasında kod satırının altına eklenmiştir. Manifest dosyasında (AndroidManifest.xml), etkinlik yapısına aşağıdaki özniteliği ekleyin

android: windowSoftInputMode = "stateHidden"

Misal:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

İkinci Çözüm , faaliyetteki kod satırının altına eklemektir

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Yukarıdakilerden herhangi birini kullanabiliriz. Teşekkürler


5

InputMethodManager için global değişkeni bildirin:

 private InputMethodManager im ;

OnCreate () altında tanımlayın:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

OnClickListener'ı oncreate () içindeki düzenleme metnine ayarlayın:

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

Bu çalışacak.


Lütfen kodunuzu gönderin. İdam ederken ne alıyorsun?
AndroGeek

tüm kod soruda, düzenleme metnine tıkladığımda ekrandaki tuş takımı görünmüyor
Karasinek

Bunu bir emülatör veya cihaz kullanarak mı test ediyorsunuz? Bir öykünücü kullanarak deniyorsanız, yazılım tuşlarını alamazsınız. Bir cihaz kullanarak test edin. Çalışacak.
AndroGeek

evet test etmek için bir cihaz kullanıyorum
Karasinek

Hmmm bu garip. Kodunuzu yazabilirseniz, yazdığınız yöntem biraz yardımcı olabilir. Veya yukarıdaki kod cihazımda kesinlikle iyi çalışıyor.
AndroGeek

4

Aşağıdaki kodu kullanın, altına yazın onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

4

deneyin ....... Bu sorunu şu kodu kullanarak çözüyorum: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

hiçbir şey varsayılan hesap makinesi olarak herhangi bir şey üzerinde giremezsiniz ama u herhangi bir dizge ayarlayabilirsiniz.

dene


3

İyi çözüm için teşekkürler @AB

    android:focusableInTouchMode="false"

bu durumda, düzenleme metninde klavyeyi devre dışı bırakırsanız, edittext etiket satırına android: focusableInTouchMode = "false" eklemeniz yeterlidir.

Android Studio 3.0.1 minsdk 16, maxsdk26'da benim için çalış


1
Bu, A.Byanıtlayacak bir yorum mu? Yoksa orijinal soruya bir cevap mı? Bu bir A.Byanıtın yorumuysa, StackOverflow tarafından sağlanan yorum seçeneğini kullanmalı ve bu yanıtı orijinal soruya silmelisiniz.
David Walschots

Çözülen cevabı cevaplamayı anlamadıysam özür dilerim. Sorunumu gidermek için iyi bir cevap için AB'ye teşekkür ediyorum .. Eğer yanılıyorsam, bu cevabı silebilirim, üzgünüm @DavidWalschots.
NZXT

2

Şununla dene:

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

Kapatmak için şunları kullanabilirsiniz:

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

Kodunuzda şöyle deneyin:

ed = (EditText)findViewById(R.id.editText1);

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

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});

daha önce olduğu gibi çalışıyor .... düzende yapmam gereken herhangi bir değişiklik var mı ??? Bu EditText görünümü için ??
Karasinek

tamam, şimdi birkaç düzen özelliği ekledikten sonra çalışıyor ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" teşekkür ederim
Karasinek

hayır. bir şey yap. klavye kodunu gizlemeyi edittext.setOnFocusChangeListener () yöntemine yazın ve deneyin
user1213202

hideSoftInput çağrısının tam olarak ne zaman kullanılacağını belirleyebiliyorsanız bu çözüm olacaktır. klavye otomatik olarak açılır ONCreate and onResume
ahmet emrah

2

Yapmanız gereken tek şey android:focusableInTouchMode="false", xml'deki EditText'e eklemek ve hepsi bu. (Birinin bunu kolay yoldan nasıl yapacağını hala bilmesi gerekiyorsa)


2

Ben de aynı problemi yaşadım ve sadece XML dosyasında odaklanabilir ile uğraştım.

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

Muhtemelen siz de güvenlik arıyorsunuz. Bu bunda da yardımcı olacaktır.


1

onCreate()Yönteminizde aşağıdaki kodu kullanın-

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);

1

Xamarin Kullanıcıları için:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop

1
       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

                 android:focusable="true"
                 android:focusableInTouchMode="true">

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

1

Xamarin kullanıyorsanız bunu ekleyebilirsiniz

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

daha sonra bu satırı OnCreate () yöntemine ekleyebilirsiniz

youredittext.ShowSoftInputOnFocus = false;

Hedeflenen cihaz yukarıdaki kodu desteklemiyorsa, aşağıdaki kodu EditText tıklama olayında kullanabilirsiniz.

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);

1

Aşağıdaki kalıbı, girdiyi almak için bir iletişim kutusu göstermek istediğim kodda benim için iyi çalıştığını buldum (örneğin, metin alanında görüntülenen dize, bir iletişim kutusundaki onay kutuları listesinden yapılan seçimlerin sonucudur, klavye ile girilen metin).

  1. Düzenleme alanında yumuşak girdi odağını devre dışı bırakın. Klavyenin aynı düzende kullanılmasını istediğim düzenleme alanları olduğu için tüm etkinliği devre dışı bırakamıyorum.
  2. Metin alanındaki ilk tıklamalar bir odak değişikliği, tekrarlanan tıklama bir tıklama olayı verir. Yani ikisini de geçersiz kılıyorum (burada her iki işleyicinin de aynı şeyi yaptığını göstermek için kodu yeniden düzenlemiyorum):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    

0

Oluşturmakta olduğum bir Android uygulamasında, yatay olarak düzenlenmiş üç tane EditTexts vardı LinearLayout. Parça yüklendiğinde yazılım klavyesinin görünmesini engellemek zorunda kaldım. Ayarına ek olarak focusableve focusableInTouchModeüzerinde true LinearLayout, ben sete vardı descendantFocusabilityiçin blocksDescendants. In onCreatearadım requestFocusüzerinde LinearLayout. Bu, parça oluşturulduğunda klavyenin görünmesini engelledi.

Yerleşim -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

İçinde onCreate-mTextSelectorContainer.requestFocus();


0

Hala en kolay çözümü arayan biri varsa, aşağıdaki özelliği trueana düzeninizde olarak ayarlayın.

android:focusableInTouchMode="true"

Misal:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>

Olumsuz seçmenler, lütfen olumsuz oy kullanmadan önce görüşlerinizi yorumlayın!
Ajmal Salim

0

EditText'i etkinleştirmek ve devre dışı bırakmak için bunu kullanın ...

InputMethodManager imm;

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

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }

0

Bu cevabı dene,

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Not: yalnızca API 11+ için


0
private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}

-1

aktivitenizdeki herhangi bir metin görünümü için (veya android: layout_width = "0dp" android: layout_height = "0dp" ile sahte boş metin görünümü oluşturun) ve bu metin görünümü için sonraki: android: textIsSelectable = "true" ekleyin


-1

Basit, Sadece "" etiketini xml dosyasından kaldırın


2
Lütfen bunu detaylandırabilir ve bir örnek gösterebilir misiniz? Lütfen Nasıl Cevap Verilir bölümüne bakın .
Bugs

-1

Sadece xml düzeninde android:focusable="false"özellikle özellik eklemeniz gerekir EditText. Ardından EditText, tuş takımı açılır penceresi olmadan tıklama listesi yazabilirsiniz .


-1

Bu konu kullanılarak sıralanabilir, editText inputType değerini herhangi bir değere ayarlamaya gerek yoktur, sadece aşağıdaki satırı ekleyin, editText.setTextIsSelectable (true);


Hey, cevap yazdığın için teşekkürler! Bununla birlikte, burada zaten çok fazla cevap olduğundan, bunu kendi cevabını yapmak yerine aslında Ranjith Kumar'ın cevabına bir yorum olarak yazmanız daha da faydalı olabilir. Dışarıda bırakmanın etkisinin ne olacağından bahsetmek de ilginç inputTypeolabilir. Ancak, diğer cevabı benimsersem bunu bilmek iyi olacak gibi görünüyor, bu yüzden bunu kendi cevabı olarak tutmakta ısrar etseniz bile, lütfen oraya bir yorum bırakmayı düşünün.
Mark
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.